使代码对其他子类和子子类可用

Make code available to other subclasses and subsubclasses

我做了一个超类(抽象),一个子类(抽象)和一个子子类。

有一段代码我想保留在超类的构造函数中,但除非我将它放在子类中,否则它无法正常工作。

超类:

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;
}

子子类:

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;
}
}

我希望那段代码可用于其他子类(和子子类),而不是仅在该子类中可用。

正如你在SubSubClass中调用super(x, y);一样,你需要在SubClass中做同样的事情。它没有魔法,只需将值传递给 SuperClass,以便在您尝试计算一半值之前设置 xy

我强烈建议尽可能将您的字段设置为 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;
    }

默认情况下,super() 在您分配之前从 Subclass 构造函数中的超级 class 调用构造函数:

   this.x = x;
   this.y = y;

因此你除以零,这是 int 字段的默认值。这就是 halfXhalfY 为 0 的原因。

x,y 是您的 SuperClass 的一部分,因此它们应该在那里初始化。