这个概念与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中的有效概念吗?
答案 0 :(得分:7)
首先,由于您的示例中obj2
为null
,因此当您尝试访问其中的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中有效,而且许多其他语言强烈类型。将变量向上转换为超类时,只能使用该类的属性。这使得变量强类型化。意味着您拥有可以使用的类型变量,而不管实例类型如何。您可以访问的变量类型很重要。