Java 使用超级和实例变量的构造函数
我正在使用Sams学习Java,在21天内自学Java(顺便说一句,我花的时间远远超过21天)。在第5章中,最后一个练习要求我创建一个类FourDPoint,它是Point的一个子类。我这样做了,但得到了一个有趣的结果。我第一次做这个练习时,我的代码是:Java 使用超级和实例变量的构造函数,java,oop,constructor,super,Java,Oop,Constructor,Super,我正在使用Sams学习Java,在21天内自学Java(顺便说一句,我花的时间远远超过21天)。在第5章中,最后一个练习要求我创建一个类FourDPoint,它是Point的一个子类。我这样做了,但得到了一个有趣的结果。我第一次做这个练习时,我的代码是: import java.awt.Point; class FourDPoint extends Point { int x; int y; int z; int t; FourDPoint(int x
import java.awt.Point;
class FourDPoint extends Point {
int x;
int y;
int z;
int t;
FourDPoint(int x, int y, int z, int t){
super(x, y);
this.z = z;
this.t = t;
}
public static void main(String[] arguments){
FourDPoint fp = new FourDPoint(5, 5, 10, 10);
System.out.println("x is " + fp.x);
System.out.println("y is " + fp.y);
System.out.println("z is " + fp.z);
System.out.println("t is " + fp.t);
}
}
结果:x是0,y是0,z是10,y是10
我通过删除初始化的x和y来更改代码,这给了我正确的答案。我的问题:为什么我得到x是0,y是0?初始化的x和y是否优先于super(x,y)?在子类中,可以使用自己的阴影点x和y变量。要解决此问题,您可以删除x和y(您不使用它们),也可以使用
super.x
和super.y
在构造函数中调用super()时,Point将设置其x和y字段。您自己创建了一个默认为0的x和y。因此,当您引用fp.x和fp.y时,您将始终得到它们(始终为0)假设您的类点
也声明了两个名为x
和y
的实例变量,它们就是您正在设置的变量
super(x, y);
但是,当您引用
System.out.println("x is " + fp.x);
System.out.println("y is " + fp.y);
您指的是在FourDPoint
中声明的成员。您尚未初始化它们,因此它们默认为0
另一方面,多态性不适用于实例变量。相反,该成员将根据访问它的引用的类型进行解析
所以
fp.x
将引用在FourDPoint
中声明的x
成员。但是
FourDPoint fp = ...;
fp.x;
((Point) fp).x;
((点)fp).x
将引用在点中声明的x
成员,您的类FourDPoint
包含覆盖超级点x
和y
的本地成员,注释掉这两行-
// int x;
// int y;
您从未将x
和y
的值设置为某个值,因此它们将始终返回0
是的,您可以调用超级构造函数,但这并不重要:即使在点
中存在变量x
和y
,它们也会被四点
中名为相同的变量隐藏
更不用说点
中的变量也应该受到保护
。工作流是这样的:初始化父级成员,调用父级构造函数,初始化类成员(原语设置为0)类构造函数的代码已执行。是的,它们优先,因为您重写了它们。就这么简单
// int x;
// int y;