gpt4 book ai didi

java - 使用 super AND 实例变量的构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:02 25 4
gpt4 key购买 nike

我正在使用 Sams 在 21 天内自学 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);
}
}

结果:x为0,y为0,z为10,y为10。

我更改了我的代码,删除了初始化的 x 和 y,这给了我正确的答案。我的问题:为什么我得到 x is 0 and y is 0?初始化的 x 和 y 是否优先于 super(x, y)?

最佳答案

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

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 成员。

关于java - 使用 super AND 实例变量的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com