1 /* 2 * 子父类中的构造函数的特点。 3 * 在子类构造对象时,发现,访问子类构造函数时,父类也运行了。 4 * 为什么呢? 5 * 原因是:在子类的构造函数中第一行有一个默认的隐式语句。super() 6 * 子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。 7 * 8 * 为什么子类实例化的时候要访问父类中的构造函数呢? 9 * 那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前要先看父类是如何对自己的内容进行初始化的。 10 * 11 * 所以子类在构造对象时,必须访问父类中的构造函数。 12 * 为了完成这个必须的动作,就在子类的构造函数中加入了super()语句。 13 * 14 * 如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确调用父类中的哪个构造函数。 15 * 同时子类构造函数中如果使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能 16 * 定义第一行。所以只能有一个。 17 * 但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。 18 * 19 * *注意:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。 20 */ 21 class Fu{ 22 int num; 23 Fu(){ 24 num = 10; 25 System.out.println("A fu run"); 26 } 27 //Fu(int x){ 28 // System.out.println("fu run"); 29 //} 30 Fu(int x){ 31 System.out.println("B fu run..."+x); 32 } 33 } 34 class Zi extends Fu { 35 int num; 36 Zi(){ 37 //super();//调用的就是父类中的空参数的构造函数。 38 //super(4); 39 System.out.println("C zi fun"+super.num); 40 //return; 41 } 42 Zi(int x){ 43 this();//可以调用本类的构造函数 上面的构造函数第一行还是super(); 至少会调用一次父类构造函数 44 //super(x); 45 System.out.println("D zi run"+x); 46 } 47 } 48 public class ExtendsDemo4 { 49 public static void main(String[] args) { 50 new Zi(); 51 } 52 } 53 54 class Demo{ //创建的任何类 都属于 extends Object (无论直接间接)所以会存在super()语句 55 /* 类前加public 下面构造方法默认也变成public权限 56 Demo(){ 57 super(); 58 return; 59 } 60 61 */ 62 }View Code