首页 > 解决方案 > 当子类对象被分配为超类对象时会发生什么

问题描述

所以我有一个关于超类 A 和子类 B 的问题,其中 A 有 2 个公共变量,B 有 1 个。

我看到了这段代码:

A a = new A();
B b = new B();
a = b; 

最后一行是做什么的?我真的不明白当您在继承关系中的两个类之间使用“=”时实际发生了什么。

标签: javaoopinheritancepolymorphism

解决方案


这是简单的任务。=是赋值运算符。

让我们清楚以下几点。

  1. 在 Java 中,当创建一个对象并且可以通过它访问它时。参考。引用指的是一个对象。
  2. 一次一个引用只能引用一个对象
  3. X 类型的引用可以引用 X 类型的对象或任何子类型(在 X 是类的情况下扩展或在 X 是接口的情况下实现)。

现在假设有两个类SuperSub这样的Sub extends Super

 SuperClass reference = new SubClass();  

这是允许的,因为 SubClass 继承自 SuperClass。上面我们在堆中创建了一个 SubClass 类型的对象,可以通过它访问它。参考命名reference

请注意,类型的引用SubClass不能引用 的对象SuperClass。让我们简要地看看为什么会这样?如果类型的引用SubClass被允许引用一个类型的对象,SuperClass那么它将被允许调用由SubClass(SubClass将继承的所有方法定义的附加方法(函数),SuperClass并且还将定义一些附加方法)。现在这会使应用程序崩溃,因为 ObjectSuperClass仅具有定义的方法,SuperClass但没有定义的任何其他方法SubClass。因此编译器会在编译时阻止它。SubClass引用类型对象的类型引用是编译时错误SuperClass

现在让我们看看问题中提到的代码

 SuperClass a = new SuperClass();
 SubClass b = new SubClass();
 a = b; 

第 1 行:我们有一个 SuperClass 的对象被一个名为 SuperClass 的变量引用a

第 2 行:我们有一个 SubClass 对象,由一个名为 SubClass 的变量引用b

第 3 行:我们有一个分配 where ais 分配引用与引用相同的对象b。所以现在我们有两个引用都引用SubClass了在第 2 行创建的类型对象。在第 1 行创建的 typer 对象SuperClass(使用问题中提到的当前可用代码)没有任何引用,因此它有资格进行垃圾回收。


推荐阅读