java - 当子类对象被分配为超类对象时会发生什么
问题描述
所以我有一个关于超类 A 和子类 B 的问题,其中 A 有 2 个公共变量,B 有 1 个。
我看到了这段代码:
A a = new A();
B b = new B();
a = b;
最后一行是做什么的?我真的不明白当您在继承关系中的两个类之间使用“=”时实际发生了什么。
解决方案
这是简单的任务。=
是赋值运算符。
让我们清楚以下几点。
- 在 Java 中,当创建一个对象并且可以通过它访问它时。参考。引用指的是一个对象。
- 一次一个引用只能引用一个对象
- X 类型的引用可以引用 X 类型的对象或任何子类型(在 X 是类的情况下扩展或在 X 是接口的情况下实现)。
现在假设有两个类Super
和Sub
这样的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 a
is 分配引用与引用相同的对象b
。所以现在我们有两个引用都引用SubClass
了在第 2 行创建的类型对象。在第 1 行创建的 typer 对象SuperClass
(使用问题中提到的当前可用代码)没有任何引用,因此它有资格进行垃圾回收。
推荐阅读
- java - 如何通过 websocket 在 Java 中发送 JSON RPC
- java - 如何在 Windows 上使用 java NIO2 设置文件权限?
- javascript - 创建日历不能选择过去的日子,只能选择一定数量的未来日子
- process - 处理 SSAS 表格 - 一个分区并保留数据库
- python-3.x - 从 Python 类动态确定 SQLite DATATYPE 以创建 COLUMN
- c# - 将事件的订阅者作为线程池中的任务运行
- git - git 功能、发布和修补程序有什么区别?
- android - 如何在firebase android中存储数据
- c# - UWP 复杂文本块前景
- hyperledger-fabric - 在 BYFN for Hyperledger - Fabric 中,如果我们只想通过重命名 org1 名称来运行 byfn,我们需要更新哪些文件来更新 Org 的名称