所以我有一个关于超类A和子类B的问题,其中A有2个公共变量,而B还有1个。
我看到了这段代码:
A a = new A();
B b = new B();
a = b;
最后一行是做什么的?我不太了解在继承关系的两个类之间使用“ =”时会发生什么。
答案 0 :(得分:0)
什么也没有发生。变量“ b”引用的对象是单个对象。同时是B的实例和A的实例。
执行分配a = b
时,以前由变量'a'引用的对象将变得不可访问。对该旧对象的考虑不在此讨论之列。
分配后,“ a”和“ b”表示相同的对象。对象不变。它仍然是B的实例和A的实例。
也许您理解的障碍是对象与引用这些对象的变量之间的区别?
答案 1 :(得分:0)
这是简单的任务。 =
是一个赋值运算符。
让我们清除以下几点。
现在假设有两个类Super
和Sub
,使得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
第3行:我们有一个分配,其中分配了a
来引用b
所引用的同一对象。因此,现在我们两个引用都引用了在第2行创建的类型SubClass
的对象。在第1行创建的类型为SuperClass
的对象(问题中提到了当前可用的代码)没有任何引用因此可以进行垃圾收集。