为什么我们不能拥有持有超类对象的当前类引用?

Tec*_*Sid 1 java inheritance class

让我们说如果有两个类A和B,其中A扩展B,所以按惯例A可以访问非私有的B成员.那么为什么我们不能创建B的对象并将该引用分配给A.

A类:

public class A extends B {
    public static void main(String[] args) {        
        A a = new B();          
        B b = new A();          
    }    
}
Run Code Online (Sandbox Code Playgroud)

B级:

public class B { 

}
Run Code Online (Sandbox Code Playgroud)

我的主要问题是:

  1. 为什么A a = new B();不对?
  2. 为什么B b = new A();是正确的?

T.J*_*der 8

那么为什么我们不能创建B的对象并将该引用分配给A.

1)为什么A a = new B();不正确?

因为A也(可能)拥有的功能B都没有,这样的情况下(这是B)不是一个A,这样你就可以不指定B实例的A-typed变量.

2)为什么B b = new A();是正确的?

因为实例A B实例,所以它们也可能比B实例多一些.因此,一个B-typed变量引用一个A实例是很好的(也很常见).请记住,继承是一种"是一种"关系.A extends B表示A实例是一个 B实例.

让我们使用更有意义的类名并包含一些状态:

class Super {
    private int foo;
    // ...details omitted...
}

class Sub extends Super {
    private int bar;
    // ...details omitted...
}
Run Code Online (Sandbox Code Playgroud)

所以一个实例Super有一个数据插槽foo:

+??????????????????+
| (Super instance) |
+??????????????????+
| foo: 0           |
+??????????????????+

一个实例Sub有一个插槽foo(因为它是一个 Super),也是一个插槽bar:

+??????????????????+
|  (Sub instance)  |
+??????????????????+
| foo: 0           |
| bar: 0           |
+??????????????????+

类型的变量Super可以引用Sub实例; 该实例具有a所具有的所有数据槽(和行为,未示出)Super.但是类型变量Sub不能引用Super实例; 实例没有bar数据槽(以及潜在的Sub特定行为,未显示).