这是一个分为两部分的问题:
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
处理吗?
因此,这不会仅仅因为我们试图多次访问晚饭类的成员而导致大量的内存浪费。
在上述情况下如何进行内存管理?
答案 0 :(得分:2)
创建Child
实例时,并不是在创建其他 Father
实例。 Child
实例也是一个Father
实例,因为Child
扩展了Father
。 Child
是Father
的特定类型。
一种清晰的显示方式是在两个类中都打印System.identityHashCode
,并看到Father
和Chilld
构造函数都与相同的内存地址相关:
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