java - 为什么我们不能让当前类引用持有父类(super class)对象?

标签 java class inheritance

假设有两个类 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 { 

}

我的主要问题是:

  1. 为什么 A a = new B(); 不正确?
  2. 为什么 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/

相关文章:

c++ - 使用非默认构造函数初始化成员类

database - 在数据库中使用继承的优点和缺点是什么

java - SOAP href XML 映射问题 - 哪个映射有帮助?

javascript - 如何使用 jQuery 将重复的类添加到 DOM 对象?

Java - 方法输出不返回新值?

Java - SimpleDateFormat 作为数据类型?

java - 访问子类中的私有(private)字段

python - 防止从子类访问实例变量,而不影响基类

java - 项目的异常 Spring Hibernate Jndi Tomcat

java - 如何将 MediaPlayer 对象从 JobScheduler 的 JobService 传递给 AsyncTask