你能在抽象类中声明一个抽象变量类型吗?当我放入这行代码时,我收到一个错误。我可以声明一个最终的变量而不是最终的但我不确定我是否应该能够声明一个抽象的变量。接口和抽象类之间的真正优势是什么?
Error Code:
abstract int myScore = 100; <-- Causes an error
代码:
public abstract class GraphicObject {
int home = 100;
String myString = "";
final int score = 0;
abstract void draw();
abstract void meMethod1();
abstract void meMethod2();
int meMethod3() {
return 0;
}
}
答案 0 :(得分:2)
“你能在抽象类中声明一个抽象变量类型吗?”
不,根据JLS(http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1)。
答案 1 :(得分:2)
如果你不能实现变量,为什么它应该是抽象的? 抽象方法只意味着它们必须在代码中进一步实现(通过扩展该抽象类的类)。 对于不会产生任何变量的变量,因为它们保持相同的类型。 myscore永远是一个int。
你可能会想要通过扩展该抽象类的类来覆盖myscore的值。
答案 2 :(得分:2)
抽象方法是一种没有主体的方法。这是因为它意味着在所有具体(非抽象)子类中被覆盖,并且由于多态性,永远不能调用抽象存根。
鉴于上述情况,并且由于字段没有多态性(或者根本没有覆盖字段的方法),抽象字段将毫无意义。
如果你想要做的是每个子类的默认值都不同的字段,那么你可以在每个类的构造函数中分配它的默认值。为了做到这一点,你不需要把它抽象化。
答案 3 :(得分:2)
不,使用抽象,因此方法只能在子类中实现。见http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
答案 4 :(得分:1)
您无法在Java中声明抽象变量。
如果您希望在超类中声明一个必须由其子类设置的变量,您可以定义一个抽象方法来设置该值......
例如:
public abstract class Foo {
Object obj;
public Foo() {
init();
}
protected void init() {
obj = getObjInitVal();
}
abstract protected Object getObjInitVal();
}
public class Bar extends Foo {
@Override
protected Object getObjInitVal() {
return new Object();
}
}
答案 5 :(得分:0)
基于“AlonL”回复:
你也可以这样做
public abstract class Foo {
Object obj;
public Foo() {
init();
}
abstract protected void init();
}
public class Bar extends Foo {
@Override
protected void init() {
obj = new Object();
}
}