【问题标题】:Reference of a Class ? How does it workout in memory?类的参考?它是如何在记忆中锻炼的?
【发布时间】:2014-08-24 07:39:31
【问题描述】:
class A {
}

class B extends A {
}

A a01 = new A();
A a02 = new B();

此引用 a02a01 相比有何不同?

class Aclass B 类型的引用是什么意思?

它在内存中是如何工作的?

【问题讨论】:

  • 我认为您在前面的问题中已经解决了这个问题:stackoverflow.com/questions/25468867/…您还需要什么?
  • @JonatanCloutier 不,先生,对不起,但我不明白一个类的引用如何在内存中工作,这个问题是关于多态性/动态方法调用的

标签: java


【解决方案1】:

a01a02 之间没有区别。两者都是A 类型的引用。这意味着您只能使用 A 类的成员,而不能使用它的任何子类型。

A 类或 B 类的引用是什么意思?

引用类型由引用变量的声明决定:

A a; // This is a reference of type A
B b; // This is a reference of type B

如果引用的类型是 A 类,它会自动指向 A 类的对象吗

是的,A 类型的引用必须指向 A 类型的对象,但它也可能指向任何具有A 为其类型。在您的示例中,B A,因为B extends A

【讨论】:

  • 当我们说 new A();它创建了 A 类仪式的对象?并且该对象包含A类对象的数据字段和方法....同样,A类或B类的引用是什么意思?两个参考有何不同?如果引用的类型是 A 类,它会自动指向 A 类的对象吗?
  • @VaibhavVaghela 您可能想阅读this 了解更多信息。
  • 好吧!非常感谢,如果可能的话,请 +rep,我们将不胜感激
【解决方案2】:

区分变量的声明类型和对象的运行时类很重要。

在 Java 中,每个对象都有一个 运行时类,在创建它的类实例(或数组)创建表达式中指定。运行时将这些信息存储在对象本身中,使我们能够使用instanceof 运算符或getClass() 方法对其进行查询。

此外,每个变量都有一个声明的类型。在编译时使用声明的类型来验证变量是否支持代码在它们上使用的运算符、字段和方法。为此,编译器和运行时协作以强制使用引用类型 D 声明的变量始终引用 null,或者运行时类为 D 或 D 子类型的对象(除了由于不正确使用而引起的少数病态极端情况)泛型类型)。

在内存中,您的代码将如下所示:

+-------+-------+
|  a01  |  a02  |       thread call stack
+-------+-------+
    |       |
    |       |
    v       v
+-----+  +-----+
|  A  |  |  B  |        object heap
+-----+  +-----+

【讨论】:

  • 水晶清晰的解释!现在我了解了编译时引用类型声明和运行时对象创建之间的实际区别!感谢您的帮助先生
【解决方案3】:

在此示例中,A 类是您的父类,B 类是您可能知道的子类,基本上您的子类知道您的父类。但是父类不知道有多少子类扩展了它的功能。所以基本上你可以使用父类作为引用来保存子类对象,但子类不能保存父类对象。在您的情况下,这两个对象都具有 A 类的引用,这没有任何区别。 JVM 将为堆中的对象保留内存,并在相应的对象引用中提供引用。在编译时它没有任何区别,但在运行时它将调用对象的相应方法。

【讨论】:

  • 我想我明白你想说什么了!!!!!!!如果引用是类型 B 怎么办?它与类型 A 的引用有何不同?
  • @Vaibhav - 如果引用是 B 类型,那么它只能包含 B 类对象或继承 B 类的任何类,在后一种情况下,A 类型的引用可以同时包含 A 类和 B 类对象。如果需要更多说明,可以通过 java 继承。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多