首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用超级变量和实例变量的构造函数

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

Stack Overflow用户
提问于 2013-12-16 10:41:45
回答 6查看 232关注 0票数 5

我在21天内用Sams自学Java学习Java (顺便说一句,这比21天花了我更多的时间)。在第五章中,最后的练习要求我创建一个FourDPoint类,它是Point的子类。我这样做了,但得到了一个有趣的结果。我第一次做这个练习时,代码如下:

代码语言:javascript
复制
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)?

EN

回答 6

Stack Overflow用户

发布于 2013-12-16 10:44:39

This is what we call .假设您的类Point还声明了两个名为xy的实例变量,这两个变量就是您要设置的变量

代码语言:javascript
复制
super(x, y);

但是,当您引用

代码语言:javascript
复制
System.out.println("x is " + fp.x);
System.out.println("y is " + fp.y);

您引用的是在FourDPoint中声明的成员。它们还没有被你初始化,所以它们的默认值是0。

需要注意的是,多态性不适用于实例变量。相反,将根据访问该成员的引用的类型解析该成员。

所以

代码语言:javascript
复制
FourDPoint fp = ...;
fp.x;

fp.x将引用在FourDPoint中声明的x成员。但

代码语言:javascript
复制
FourDPoint fp = ...;
fp.x;
((Point) fp).x;

((Point) fp).x;将引用在Point中声明的x成员。

票数 7
EN

Stack Overflow用户

发布于 2013-12-16 10:44:32

在您的子类中,您可以使用自己的变量来隐蔽点x和y变量。要解决此问题,您可以移除x和y(不使用它们)或使用super.xsuper.y引用点

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

票数 5
EN

Stack Overflow用户

发布于 2013-12-16 10:45:15

您的类FourDPoint包含隐藏在超级点xy的本地成员,注释掉这两行-

代码语言:javascript
复制
// int x;
// int y;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20602630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档