我必须为打印出形状的抽象父类创建子类,但每当我尝试创建一个对象时,它一直告诉我我不能实例化一个抽象类,当我从中删除关键字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);
}
答案 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() 所以参数不匹配