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

时间:2016-01-15 23:24:44

标签: java constructor subclass abstract superclass

我制作了一个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;
}
}

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

2 个答案:

答案 0 :(得分:3)

正如您在super(x, y);中呼叫SubSubClass一样,您需要在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;
    }

答案 1 :(得分:0)

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

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

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

x,y是您SuperClass的一部分,因此应该在那里进行宣传。