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

Java 使代码可用于其他子类和子类,java,constructor,subclass,abstract,superclass,Java,Constructor,Subclass,Abstract,Superclass,我创建了一个超类(抽象)、一个子类(抽象)和一个子类 有一段代码我想保存在超类的构造函数中,但除非我把它放在子类中,否则它无法正常工作 超类: public abstract class SuperClass{ protected int x, y, halfX, halfY; public SuperClass(){ halfX = x / 2; halfY = y / 2; } 子类: public abstract class SubClass extends Sup

我创建了一个超类(抽象)、一个子类(抽象)和一个子类

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

超类:

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 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;
}
如果我移除
halfX=x/2
halfY=y/2并将其放入子类构造函数中,代码即可工作。像这样:

public abstract class SubClass() extends SuperClass{

public SubClass(int x, int y){
    this.x = x;
    this.y = y;

    halfX = x / 2;
    halfY = y / 2;
}
}

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

正如您所称的
super(x,y)
子类
中,您需要在
子类
中执行相同的操作。它没有什么神奇之处,只需将值传递给超类,以便在尝试计算一半值之前设置
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;
    }

正如你所说的
super(x,y)
子类
中,您需要在
子类
中执行相同的操作。它没有什么神奇之处,只需将值传递给超类,以便在尝试计算一半值之前设置
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;
    }
默认情况下,
super()

   this.x = x;
   this.y = y;
因此,您将零除法,这是int字段的默认值。这就是为什么
halfX
halfY
为0

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

默认情况下,
super()
子类中的超类调用构造函数,然后再分配:

   this.x = x;
   this.y = y;
因此,您将零除法,这是int字段的默认值。这就是为什么
halfX
halfY
为0


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

Hmm谢谢您的回答。我认为我陷入困境的原因是,我有一个代码,可以为子类添加更多参数。如果我想在子类中添加2-3个额外参数,我会如何处理?@Talabo如果子类的参数比超类多,你应该向超类传递更少的参数,并处理子类中的额外参数。谢谢:)我将查看如何在子类中添加更多参数:)@Talabo我将其添加到了我的答案中。你需要在子类中有一个包含更多参数的构造函数。我的错,非常感谢你的帮助。今晚我终于可以不用担心睡觉了:)嗯,谢谢你的回答。我认为我陷入困境的原因是,我有一个代码,可以为子类添加更多参数。如果我想在子类中添加2-3个额外参数,我会如何处理?@Talabo如果子类的参数比超类多,你应该向超类传递更少的参数,并处理子类中的额外参数。谢谢:)我将查看如何在子类中添加更多参数:)@Talabo我将其添加到了我的答案中。你需要在子类中有一个包含更多参数的构造函数。我的错,非常感谢你的帮助。今晚我终于可以不用担心睡觉了:)谢谢。我可能会专注于用不同的方式来表达。这样的想法是在超类之后向子类构造函数添加更多参数,所以我的问题可能会有点不同,我想:)谢谢。我可能会专注于用不同的方式来表达。这样的想法是在超类之后向子类构造函数添加更多参数,所以我的问题可能会有点不同:)