使代码对其他子类和子子类可用
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,以便在您尝试计算一半值之前设置 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()
在您分配之前从 Subclass
构造函数中的超级 class 调用构造函数:
this.x = x;
this.y = y;
因此你除以零,这是 int 字段的默认值。这就是 halfX
和 halfY
为 0 的原因。
x,y
是您的 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;
}
子子类:
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,以便在您尝试计算一半值之前设置 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()
在您分配之前从 Subclass
构造函数中的超级 class 调用构造函数:
this.x = x;
this.y = y;
因此你除以零,这是 int 字段的默认值。这就是 halfX
和 halfY
为 0 的原因。
x,y
是您的 SuperClass
的一部分,因此它们应该在那里初始化。