使用超级AND实例变量的构造函数

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)吗?

Sot*_*lis 7

这就是我们所说的隐藏.假设你的类Point也声明了一个名为两个实例变量xy,这些都是你与设定的那些

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.


Sin*_*int 5

在子类中,您可以使用自己的变量对x和y变量进行阴影处理.要解决此问题,您可以删除x和y(不使用它们)或使用super.x和引用Pointssuper.y

在构造函数中调用super()时,Point会设置其x和y字段.你自己创建了一个x和y,默认为0.所以当你引用fp.x和fp.y时,你总会得到你的(总是0)


Ell*_*sch 5

你的类FourDPoint包含影响超级点的本地成员,xy注释掉这两行 -

// int x;
// int y;
Run Code Online (Sandbox Code Playgroud)