每次实例化子类时都会创建超类对象吗?

时间:2018-06-30 06:38:50

标签: java object inheritance constructor

这是一个分为两部分的问题:

PART#1:

public class Test {

    public static void main(String[] args) {

        System.out.println("Main Started");
        Child c = new Child();          //Instantiating Child Class
        System.out.println("Main Ended");
    }

}

class Father{

    Father(){                           //Father Class Default Constructor
        System.out.println("I am in Father");
    }

    void show(){
        System.out.println("Hello World");
    }
}

class Child extends Father{

    Child(){                            //Child Class Default Constructor
        System.out.println("I am in Child");
    }
}

输出:

Main Started
I am in Father
I am in Child
Main Ended

这是我所知道的在编译时发生的情况

class Child extends Father{

    Child(){                            //Child Class Default Constructor
        super();
        System.out.println("I am in Child");
    }
}

我的问题是,由于在执行Father类的默认构造函数之前,将使用Child类的默认构造函数,是否为Father创建了一个对象? / p>

如果是,那么它被分配给什么?还是类似于new Father();这样的匿名对象。是{strong>每次创建的Object构造函数吗?

PART#2

每次我为Child类创建一个对象时,Father类的默认构造函数将在super();中使用Child()进行调用。

当我尝试使用Father对象从Child调用任何方法时会发生什么?它会再次为Father创建一个匿名对象,使用该对象执行,然后留给Garbage Collector处理吗?

因此,这不会仅仅因为我们试图多次访问晚饭类的成员而导致大量的内存浪费。

在上述情况下如何进行内存管理?

1 个答案:

答案 0 :(得分:2)

创建Child实例时,并不是在创建其他 Father实例。 Child实例也是一个Father实例,因为Child扩展了FatherChildFather的特定类型。

一种清晰的显示方式是在两个类中都打印System.identityHashCode,并看到FatherChilld构造函数都与相同的内存地址相关:

public class Test {
    public static void main(String[] args) {

        System.out.println("Main Started");
        Child c = new Child();          //Instantiating Child Class
        System.out.println("Main Ended");
    }

}

class Father{

    Father(){                           //Father Class Default Constructor
        System.out.println("I am in Father in address " + System.identityHashCode(this));
    }

    void show(){
        System.out.println("Hello World");
    }
}

class Child extends Father{

    Child(){                            //Child Class Default Constructor
        System.out.println("I am in Child in address " + System.identityHashCode(this));
    }
}

和示例输出:

Main Started
I am in Father in address 2001049719
I am in Child in address 2001049719
Main Ended