我在21天内用Sams自学Java学习Java (顺便说一句,这比21天花了我更多的时间)。在第五章中,最后的练习要求我创建一个FourDPoint类,它是Point的子类。我这样做了,但得到了一个有趣的结果。我第一次做这个练习时,代码如下:
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)?
发布于 2013-12-16 10:44:39
This is what we call .假设您的类Point还声明了两个名为x和y的实例变量,这两个变量就是您要设置的变量
super(x, y);但是,当您引用
System.out.println("x is " + fp.x);
System.out.println("y is " + fp.y);您引用的是在FourDPoint中声明的成员。它们还没有被你初始化,所以它们的默认值是0。
需要注意的是,多态性不适用于实例变量。相反,将根据访问该成员的引用的类型解析该成员。
所以
FourDPoint fp = ...;
fp.x;fp.x将引用在FourDPoint中声明的x成员。但
FourDPoint fp = ...;
fp.x;
((Point) fp).x;((Point) fp).x;将引用在Point中声明的x成员。
发布于 2013-12-16 10:44:32
在您的子类中,您可以使用自己的变量来隐蔽点x和y变量。要解决此问题,您可以移除x和y(不使用它们)或使用super.x和super.y引用点
当您在构造函数中调用super()时,Point将设置其x和y字段。您自己创建了一个默认为0的x和y。因此,当你引用fp.x和fp.y时,你总是会得到你的结果(它们总是0)
发布于 2013-12-16 10:45:15
您的类FourDPoint包含隐藏在超级点x和y的本地成员,注释掉这两行-
// int x;
// int y;https://stackoverflow.com/questions/20602630
复制相似问题