假设有两个类 A 和 B,其中 A 扩展 B,因此按照惯例 A 可以访问 B 的非私有(private)成员。那么,为什么我们不能创建 B 的对象并将该引用分配给 A。
A 类:
public class A extends B {
public static void main(String[] args) {
A a = new B();
B b = new A();
}
}
B 类:
public class B {
}
我的主要问题是:
- 为什么
A a = new B();
不正确? - 为什么
B b = new A();
是正确的?
最佳答案
So why can't we create an object of B and assign that reference to A.
1) Why
A a = new B();
is incorrect?
因为 A
也(可能)具有 B
没有的特性,所以实例(它是 B
)不是 A
,因此您不能将 B
实例分配给 A
类型的变量。
2) Why
B b = new A();
is correct?
因为 A
的实例是 B
的实例,所以它们也可能比 B
的实例多一点.因此,B
类型的变量引用 A
实例是正常的(也是常见的)。请记住,继承是一种“是一种”关系。 A extends B
表示一个A
实例是一个 B
实例。
让我们使用更有意义的类名并包含一些状态:
class Super {
private int foo;
// ...details omitted...
}
class Sub extends Super {
private int bar;
// ...details omitted...
}
所以 Super
的一个实例有一个 foo
的数据槽:
+−−−−−−−−−−−−−−−−−−+ | (Super instance) | +−−−−−−−−−−−−−−−−−−+ | foo: 0 | +−−−−−−−−−−−−−−−−−−+
Sub
的实例有一个 foo
槽(因为它是一个 Super
)还有一个bar
的插槽:
+−−−−−−−−−−−−−−−−−−+ | (Sub instance) | +−−−−−−−−−−−−−−−−−−+ | foo: 0 | | bar: 0 | +−−−−−−−−−−−−−−−−−−+
Super
类型的变量可以引用 Sub
实例;该实例具有 Super
具有的所有数据槽(和行为,未显示)。但是 Sub
类型的变量不能引用 Super
实例;该实例没有 bar
数据槽(以及可能的 Sub
特定行为,未显示)。
关于java - 为什么我们不能让当前类引用持有父类(super class)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51405143/