我被困在这一部分。
class1 cls = new class2(); //class1 reference and class2 object
我知道这是方法重写,但不知何故没有清楚地了解幕后的实际情况。我需要一个清晰的视图,因为我可以在需要它的地方实现它。任何带有示例的答案都会使概念更清晰。谢谢
答案 0 :(得分:3)
好吧,它不是方法覆盖,就像下面的情况一样,
Horse
是Animal
。在Java中,您会说Horse
是Animal
的子类。
现在,让我们说有一匹名叫“闪电”的马。在某种Java意义上,您可以编写Horse horse1 = new Horse( "loghtening" );
但是......因为每匹马都是动物......所以你也可以写,Animal animal1 = new Horse( "loghtening" );
但是......那有什么不同......?嗯...区别在于,当你指的是动物时,你应该谈论适用于所有动物的事情......而不仅仅是马。在任何谈话中...如果你说任何动物的“特定马”......人们会感到困惑。例如,你不能只说“我骑在我的宠物动物身上减轻了光线”......好吧......其他人不知道闪电是马,你不能骑在所有动物身上。同样,在Java中,即使Horse
类有方法rideOnMyBack
,也无法调用animal1.rideOnMyBack()
...因为在与Java的对话中... animal1
被称为动物
答案 1 :(得分:1)
您问题中的代码行通常被称为“编程到接口”。它不是“方法重写”。
在例如此网站上搜索此内容。例如。看着。 What does it mean to "program to an interface"?
答案 2 :(得分:0)
您的问题的代码段应为Class1 class1 = new class2();
而不是class class1 = new class2();
,因为您无法指定任何对象以引用class
。
这不是方法覆盖。
方法覆盖是您在类中编写方法的方法,该方法具有与其超类中的方法之一相同的名称,相同的参数和相同的返回类型。
在您的情况下,它被称为类型转换或自动装箱/取消装箱。假设你的情况是Class2 extends Class1
,那么当你将实际在内存中实例化Class2时,将会在内存中创建三个对象,如下图所示 -
现在,当你Class1 class1 = new class2();
时,实际上将分配Class1本身的引用。但根据代码,你会感觉在Class1中分配Class2的对象,这在java中是不可能的。
作为一个拇指规则,你只能为一个引用分配该类的对象或null,没有别的。
现在访问方法和变量 -