Java中的引用和对象

时间:2015-02-18 13:03:50

标签: java object reference

我被困在这一部分。

class1 cls = new class2(); //class1 reference and class2 object

我知道这是方法重写,但不知何故没有清楚地了解幕后的实际情况。我需要一个清晰的视图,因为我可以在需要它的地方实现它。任何带有示例的答案都会使概念更清晰。谢谢

3 个答案:

答案 0 :(得分:3)

好吧,它不是方法覆盖,就像下面的情况一样,

  1. HorseAnimal。在Java中,您会说HorseAnimal的子类。

  2. 现在,让我们说有一匹名叫“闪电”的马。在某种Java意义上,您可以编写Horse horse1 = new Horse( "loghtening" );

  3. 但是......因为每匹马都是动物......所以你也可以写,Animal animal1 = new Horse( "loghtening" );

  4. 但是......那有什么不同......?嗯...区别在于,当你指的是动物时,你应该谈论适用于所有动物的事情......而不仅仅是马。在任何谈话中...如果你说任何动物的“特定马”......人们会感到困惑。例如,你不能只说“我骑在我的宠物动物身上减轻了光线”......好吧......其他人不知道闪电是马,你不能骑在所有动物身上。同样,在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时,将会在内存中创建三个对象,如下图所示 -

enter image description here

现在,当你Class1 class1 = new class2();时,实际上将分配Class1本身的引用。但根据代码,你会感觉在Class1中分配Class2的对象,这在java中是不可能的。

作为一个拇指规则,你只能为一个引用分配该类的对象或null,没有别的。

现在访问方法和变量 -

  • 将始终优先考虑子类的方法。因此,如果您有两个具有相同名称,相同参数的方法,则将调用子类的方法。这称为方法覆盖。
  • 将始终访问同一类的实例变量。