public class Extends3_Demo
{
public static void main(String[] args)
{
Zi z = new Zi();
}
}
/*
子父类中的构造函数的特点:
在子类构造对象时,发现,访问子类构造函数时,父类也运行了
是因为:在子类的构造函数中第一行有一个默认隐式语句,super();
子类的实例化过程,子类中所有的构造函数默认都会访问父类中的空参数的构造函数。
为什么子类实例化的时候要访问父类中的构造函数呢?
那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,
要先看父类是如何对自己的内容进行初始化的。
所以子类在构造对象时,必须访问父类中的构造函数。
为了完成这个必须的动作,就在子类的构造函数中默认加入了super()语句。
如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中哪个构造函数。
注意:super语句必须要定义在子类构造函数的第一行,因为父类的初始化动作要先完成。
*/
class Fu
{
Fu(int x)
{
System.out.println("Fu类构造函数");
}
}
class Zi extends Fu
{
Zi()
{
super(5); //要父类的构造函数不是空参数,那super就要自定义
//这里有一句隐式的super(); //调用的就是父类中的空参数的构造函数
System.out.println("Zi类的构造函数");
}
}
/*
一个对象实例化过程:
Zi z = new Zi();
1、JVM对读取指定的路径下的Zi.class文件,并加载经内存。并会先加载Zi的父类(如果有直接父类的情况下)。
2、在堆内存中开辟空间,分配地址。
3、并在对象空间中,对对象中的属性进行默认初始化。
4、调用对应的构造函数进行初始化。
5、在构造函数中,第一行会先调用父类中构造函数进行初始化。
6、父类初始化完毕后,再对子类的属性进行显示初始化。
(通过super()初始化父类内容时,子类的成员变量并未显示初始化,等super()父类初始化完毕后才进行子类的成员变量显示初始化)
7、再进行子类构造函数的特定初始化。
8、初始化完毕后,将地址值给引用变量。