【问题标题】:Parent class reference pointing to Child class Object指向子类对象的父类引用
【发布时间】:2015-02-02 09:57:57
【问题描述】:

我对对象生命周期感到困惑。如果指向子类对象和方法的父类引用被覆盖。例如

class Parent {
     public void display(){
           System.out.println("i am from Parent");
     }
}

class Child extends Parent {
     public void method1() { }

     public void display(){
           System.out.println("i am from Child class");
     }
}

现在如果我创建主类

Parent p = new Child();

我理解的对象生命周期是否正确?如果没有,请指导我。

  1. 新的Child()构造函数被调用

  2. super()方法父类构造函数(默认构造函数)调用

  3. 现在根据对象生命周期调用第一个构造函数并将父类中的display()方法的具体方法存储在堆中。

  4. 在子类构造函数完成执行后,method1()display() 方法被存储在堆内存中。

现在,如果我调用p.display(),它将执行子类display() 方法,但是如果您看到父类和子类display() 方法都存储在堆内存中。

如果这种行为正确,那么在堆中存储父级的display() 方法有什么用。

【问题讨论】:

  • 您可以轻松测试所有问题。
  • 两种方法的行为不同。他们不一样。如果你想执行父方法,它需要存在
  • 创建子实例时,在子构造函数之前调用父构造函数。
  • 方法存储在永久空间(方法区域)中。但是否全部存储以及存储时间取决于实现
  • 你误解和混淆了不相关的概念,例如:对象生命周期 类加载(这个负责加载类型定义及其方法);类构造函数 实例构造函数;对象 方法;等

标签: java heap-memory overriding object-create


【解决方案1】:

您在第 1、2 条上是对的(super() 将隐含地成为您的子构造函数的第一条语句。)。方法不会存储在堆上。它只是对象的属性,对象本身存储在堆上。它只是存储在perm gen区域中的类和方法的定义,与heap分离。

【讨论】:

    【解决方案2】:

    这是因为您可能需要使用 super.basemethodname 从派生类中的其他方法调用类显示方法。 .在 super 中也可能会重载显示,因此您可以通过传递正确的参数来区分并调用正确的方法

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 2016-03-26
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多