我制作了一个SuperClass(摘要),一个子类(Abstract)和一个SubSubClass。
我想在SuperClass的构造函数中保留一段代码,但除非我把它改为Subclass,否则它将无法正常工作。
SuperClass:
public abstract class SuperClass{
protected int x, y, halfX, halfY;
public SuperClass(){
halfX = x / 2;
halfY = y / 2;
}
子类:
public abstract class SubClass extends SuperClass{
public SubClass(int x, int y){
this.x = x;
this.y = y;
}
SubSubClass:
public class SubSubClass extends SubClass{
int half;
public SubSubClass(int x, int y){
super(x, y);
}
public void myMethod(){
half = halfX + halfY;
}
如果我从SuperClass构造函数中删除halfX = x / 2;
halfY = y / 2;
并将其放入Subclass构造函数中,则代码可以正常工作。像这样:
public abstract class SubClass() extends SuperClass{
public SubClass(int x, int y){
this.x = x;
this.y = y;
halfX = x / 2;
halfY = y / 2;
}
}
我希望这段代码可用于其他子类(和子类),而不仅仅是在那个子类中。
答案 0 :(得分:3)
正如您在super(x, y);
中呼叫SubSubClass
一样,您需要在SubClass
中执行相同的操作。它没有神奇之处,只需将值传递给SuperClass,以便在尝试计算值的一半之前设置x
和y
。
我强烈建议您尽可能使用final
字段,在这种情况下,它们应为final
。
顺便说一句:如果你想看看发生了什么,你可以在调试器中单步调试代码。
public abstract class SuperClass{
protected final int x, y, halfX, halfY;
public SuperClass(int x, int y){
this.x = x; // set x before using it.
this.y = y; // set y before using it.
halfX = x / 2;
halfY = y / 2;
}
}
public abstract class SubClass extends SuperClass{
private final int z;
public SubClass(int x, int y, int z){
super(x, y);
// only set fields of SubClass
this.z = z;
}
答案 1 :(得分:0)
默认情况下,super()
在分配之前从Subclass
构造函数中的超类调用构造函数:
this.x = x;
this.y = y;
因此你是dividng零,这是int字段的默认值。这就是halfX
和halfY
为0的原因。
x,y
是您SuperClass
的一部分,因此应该在那里进行宣传。