K'n*_*ime 5 java oop constructor super
我在21天内使用Sams Teach Yourself Java学习Java(顺便说一下,这花了我超过21天的时间).在第5章中,最后的练习要求我创建一个类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);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:x为0,y为0,z为10,y为10.
我通过消除经过引用的x和y来改变我的代码,这给了我正确的答案.我的问题:为什么我得到x是0而y是0?intitiaized x和y优先于super(x,y)吗?
这就是我们所说的隐藏.假设你的类Point
也声明了一个名为两个实例变量x
和y
,这些都是你与设定的那些
super(x, y);
Run Code Online (Sandbox Code Playgroud)
但是,当你参考
System.out.println("x is " + fp.x);
System.out.println("y is " + fp.y);
Run Code Online (Sandbox Code Playgroud)
你指的是在中宣布的成员FourDPoint
.那些还没有被你初始化,所以它们默认为0.
在相关的说明中,多态性不适用于实例变量.而是根据您访问它的引用类型解析该成员.
所以
FourDPoint fp = ...;
fp.x;
Run Code Online (Sandbox Code Playgroud)
fp.x
会引用在中x
声明的成员FourDPoint
.但
FourDPoint fp = ...;
fp.x;
((Point) fp).x;
Run Code Online (Sandbox Code Playgroud)
((Point) fp).x;
会引用在中x
声明的成员Point
.
在子类中,您可以使用自己的变量对x和y变量进行阴影处理.要解决此问题,您可以删除x和y(不使用它们)或使用super.x
和引用Pointssuper.y
在构造函数中调用super()时,Point会设置其x和y字段.你自己创建了一个x和y,默认为0.所以当你引用fp.x和fp.y时,你总会得到你的(总是0)
归档时间: |
|
查看次数: |
189 次 |
最近记录: |