Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用超级和实例变量的构造函数_Java_Oop_Constructor_Super - Fatal编程技术网

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

Java 使用超级和实例变量的构造函数,java,oop,constructor,super,Java,Oop,Constructor,Super,我正在使用Sams学习Java,在21天内自学Java(顺便说一句,我花的时间远远超过21天)。在第5章中,最后一个练习要求我创建一个类FourDPoint,它是Point的一个子类。我这样做了,但得到了一个有趣的结果。我第一次做这个练习时,我的代码是: import java.awt.Point; class FourDPoint extends Point { int x; int y; int z; int t; FourDPoint(int x

我正在使用Sams学习Java,在21天内自学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是0,y是0?初始化的x和y是否优先于super(x,y)?

在子类中,可以使用自己的阴影点x和y变量。要解决此问题,您可以删除x和y(您不使用它们),也可以使用
super.x
super.y

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

假设您的类
也声明了两个名为
x
y
的实例变量,它们就是您正在设置的变量

super(x, y);
但是,当您引用

System.out.println("x is " + fp.x);
System.out.println("y is " + fp.y);
您指的是在
FourDPoint
中声明的成员。您尚未初始化它们,因此它们默认为0

另一方面,多态性不适用于实例变量。相反,该成员将根据访问它的引用的类型进行解析

所以

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

FourDPoint fp = ...;
fp.x;
((Point) fp).x;

((点)fp).x
将引用在
中声明的
x
成员,您的类
FourDPoint
包含覆盖超级点
x
y
的本地成员,注释掉这两行-

// int x;
// int y;

您从未将
x
y
的值设置为某个值,因此它们将始终返回0

是的,您可以调用超级构造函数,但这并不重要:即使在
中存在变量
x
y
,它们也会被
四点
中名为相同的变量隐藏


更不用说
中的变量也应该受到
保护

工作流是这样的:初始化父级成员,调用父级构造函数,初始化类成员(原语设置为0)类构造函数的代码已执行。

是的,它们优先,因为您重写了它们。就这么简单

// int x;
// int y;