查询java中的字段阴影

时间:2014-12-24 16:06:02

标签: java

这个概念与class及其实例的概念相矛盾。

以下是对我来说很好的程序,并按预期提供NullPointerException

class SuperClass{
    int x = 2;
}

class SubClass extends SuperClass{
    int x = 4;
}

public class Dummy2 {

    public static void main(String[] args){
        SubClass obj1 = new SubClass();
        SuperClass obj2 = null;
        System.out.println(obj1.x);
        System.out.println(obj2.x);
    }

}

但是,当我奇怪地说SuperClass obj2 = obj1;时,我看到SuperClass实例成员值2的值, 尽管在上述程序中没有创建class SuperClass的实例。

这是Java中的有效概念吗?

2 个答案:

答案 0 :(得分:7)

首先,由于您的示例中obj2null,因此当您尝试访问其中的x时,它会抛出NPE。

其次,当您设置obj2 = obj1时,您将obj1类型SubClass投射到SuperClass类型。然后,当您访问x中的obj2时,您正在访问x知道的SuperClass,其值为2。这就是它的工作方式。

原因是,x中的SubClass并未覆盖x中的SuperClass。它只是隐藏它。因此,当obj1转换为SuperClass类型时,x中的SuperClass现在可见x

如果您希望获得您似乎期望的x值,只需使用getter而不是直接访问x,然后您可以在SubClass中覆盖它。

超类:

public class SuperClass {
    public int x = 2;

    public int getX() {
        return x;
    }
}

亚类:

public class SubClass extends SuperClass {
    public int x = 4;

    public int getX() {
        return x;
    }
}

测试代码:

SubClass obj1 = new SubClass();
SuperClass obj2 = obj1;

System.out.println(obj2.x);      // outputs 2
System.out.println(obj2.getX()); // outputs 4

答案 1 :(得分:0)

它在java中有效,而且许多其他语言强烈类型。将变量向上转换为超类时,只能使用该类的属性。这使得变量强类型化。意味着您拥有可以使用的类型变量,而不管实例类型如何。您可以访问的变量类型很重要。