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从超类构造函数中选择code>并将其放入子类构造函数中,代码即可工作。像这样:
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我将其添加到了我的答案中。你需要在子类中有一个包含更多参数的构造函数。我的错,非常感谢你的帮助。今晚我终于可以不用担心睡觉了:)谢谢。我可能会专注于用不同的方式来表达。这样的想法是在超类之后向子类构造函数添加更多参数,所以我的问题可能会有点不同,我想:)谢谢。我可能会专注于用不同的方式来表达。这样的想法是在超类之后向子类构造函数添加更多参数,所以我的问题可能会有点不同:)