将子类对象分配为超类对象时会发生什么

时间:2019-03-31 00:01:22

标签: java oop inheritance polymorphism

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

我看到了这段代码:

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

最后一行是做什么的?我不太了解在继承关系的两个类之间使用“ =”时会发生什么。

2 个答案:

答案 0 :(得分:0)

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

执行分配a = b时,以前由变量'a'引用的对象将变得不可访问。对该旧对象的考虑不在此讨论之列。

分配后,“ a”和“ b”表示相同的对象。对象不变。它仍然是B的实例和A的实例。

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

答案 1 :(得分:0)

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

让我们清除以下几点。

  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行:我们有一个名为Sub b

的SubClass类型的变量引用的SubClass对象。

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