【问题标题】:What happens when a subclass object is assigned as a superclass object当子类对象被分配为超类对象时会发生什么
【发布时间】:2019-03-31 00:01:22
【问题描述】:

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

我看到了这个sn-p的代码:

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

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

【问题讨论】:

  • 如果你有int x = 0; int y = 1; x = y;,它会做什么?
  • 未分配对象。已分配参考文献。

标签: java oop inheritance polymorphism


【解决方案1】:

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

让我们清楚以下几点。

  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 的所有方法并且还会定义一些额外的方法)。现在这会使应用程序崩溃,因为SuperClass 的对象只有SuperClass 中定义的方法,但没有SubClass 中定义的任何其他方法。因此编译器会在编译时阻止它。引用 SubClass 类型的引用引用 SuperClass 类型的对象是一个编译时错误

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

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

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

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

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

【讨论】:

  • 非常感谢!现在清楚多了。因此,如果我们使用“b = a”代替(在第 3 行)会导致运行时/编译错误?因为 SubClass 类型的变量不能引用 SuperClass 的对象?
  • @din abarbanel 是的,没错,我已经编辑了我的答案以包括对此的解释。希望对你有帮助
【解决方案2】:

什么都没有发生。变量“b”引用的对象是单个对象。它同时是一个 B 的实例和一个 A 的实例。

当您执行赋值a = b 时,以前由变量“a”引用的对象变得不可访问。对那个旧对象的考虑不进入本次讨论。

赋值后,'a' 和 'b' 指向同一个对象。对象不变。它仍然是 B 的实例和 A 的实例。

也许你理解的障碍是对象和引用这些对象的变量之间的区别?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2016-08-20
    • 2018-12-16
    • 2019-08-15
    • 2012-07-23
    • 2018-02-02
    相关资源
    最近更新 更多