如何覆盖子类中的抽象方法?

时间:2016-08-25 19:05:35

标签: java override

我必须为打印出形状的抽象父类创建子类,但每当我尝试创建一个对象时,它一直告诉我我不能实例化一个抽象类,当我从中删除关键字abstract时我的代码覆盖了,它说我也做不到。

我的代码:

public class Rectangle extends VectorObject {
    protected int ID, x, y, xlnth, ylnth;
    protected int matrix[][];

    Rectangle(int id, int ax, int ay, int xlen, int ylen) {
        super(id, ax, ay);
        xlnth = xlen;
        ylnth = ylen;
    }

    public int getId() {
        return ID;
    }

    public void draw() {
        String [][] matrix = new String[20][20];
        for (int i = 0; i < 20; i++) {
            for (int j = 0; j < 20; j++) {
                if (i == x) {
                    matrix[i][y] = "*";
                }
                if (j==y) {
                    matrix[i][y] = "*";
                }
                System.out.println(matrix[i][y]);
            }
        }
    }
}

抽象父类:

abstract class VectorObject {
    protected int id, x, y;

    VectorObject(int anId, int ax, int ay) {
        id = anId;
        x = ax;
        y = ay;
    }

    int getId() {
        return id;
    }

    void setNewCoords(int newx, int newy) {
        x = newx;
        y = newy;
    }

    public abstract void draw (char [][] matrix);
}

3 个答案:

答案 0 :(得分:5)

当你在类中定义一个抽象方法时,你会说这个对象的子类必须实现它们,除非它们是另一个抽象类。因此,当您使用VectorObject类扩展Rectange时,必须使用相同的参数实现draw方法。

查看您在VectorObject中提供的功能的标题:

public abstract void draw ( char [][] matrix );

现在让我们看一下Rectange中提供的函数的标题:

public void draw()

这些不一样,因此它不被视为覆盖并且存在错误,因为您尚未实现方法draw( char[][] matrix )

Rectange中实施的正确方法是:

public class Rectangle extends VectorObject {


   //... various methods and variable declarations.


    @Override
    public void draw( char[][] matrix ) {
       //... draw the Rectangle object
    }
}

当我们添加@Override注释时,我们告诉编译器我们正在覆盖父类方法。在实现父类方法时,您应该始终使用此注释,因为如果您以某种方式搞砸了签名,它会让您知道,并且其他开发人员更容易理解。

答案 1 :(得分:2)

为了覆盖方法,他们必须具有匹配的签名。

抽象父方法有angular.module('name-App').factory('myService', function($http,$rootScope) { return { getFoos: function(stock) { console.log("----------->"+stock.toString());//displays the value correctly over here . //return the promise directly. return $http({ url:'http://localhost:3000/gethistorydata', method: "GET", params: stock }).then(function(result) { alert("result.data"+result.data); return result.data; }).catch(function(fallback) { alert("failed"+fallback + '!!'); }); } } }); ;而儿童方法并没有采取任何论据。因此,你覆盖。

换句话说:覆盖不仅仅是拥有两个同名的方法!

你应该总是做的简单事情:将@Override注释放在你认为的任何方法上:我在这里覆盖了一些东西。

如果您知道这一点,编译器会立即告诉您,draw()的Rectangle版本不会覆盖任何内容!

答案 2 :(得分:-1)

方法签名不一样。父母和孩子的参数不同。 尝试将@Override注释添加到子类方法,它将显示问题 @Override注释确保遵循覆盖方法的所有强制性行为。将使用父方法检查带注释的方法。如果没有匹配签名的方法,则会显示编译错误。

在您的情况下,您需要覆盖的父抽象类方法是  public abstract void draw(char [] [] matrix) 而子类方法签名是  public void draw() 所以参数不匹配