Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 指向子类对象的父类引用_Java_Heap Memory_Overriding_Object Create - Fatal编程技术网

Java 指向子类对象的父类引用

Java 指向子类对象的父类引用,java,heap-memory,overriding,object-create,Java,Heap Memory,Overriding,Object Create,我对对象的生命周期感到困惑。如果重写了指向子类对象和方法的父类引用。比如说 class Parent { public void display(){ System.out.println("i am from Parent"); } } class Child extends Parent { public void method1() { } public void display(){ System.o

我对对象的生命周期感到困惑。如果重写了指向子类对象和方法的父类引用。比如说

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();
我的理解对象生命周期是否正确?如果没有,请引导我

  • 调用新的
    Child()
    构造函数

  • 通过
    super()
    方法调用父类构造函数(默认构造函数)

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

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

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


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

    项目符号1、2是正确的(
    super()
    将隐式地成为子构造函数的第一条语句)。方法未存储在堆上。它只是对象的属性,对象本身存储在堆上。这只是存储在perm gen区域中的类和方法的定义,它与堆是分开的。

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

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