子父類構造函數函數
*在對子類的構造函數進行初始化時,對父類的構造函數也會運行
那是由於子類構造函數第一行有一條隱式的語句super();
super():會訪問父類中的空參數的構造函數,且子類中的全部構造函數默認第一行都是super();this
public class ExtendsDemo { public static void main(String[] args) { Zi zi=new Zi(); } } class Fu{ Fu(){ System.out.println("show fu"); } } class Zi extends Fu{ Zi(){ //super() 隱式語句 System.out.println("show zi"); } }
輸出結果:spa
show fu
show zicode
先運行super(),運行父類的空參數構造函數,再運行子類本身的方法。blog
默認時,父類的有參構造函數不能直接被子類繼承,由於super()只能直繼承父類中無參的構造函數,繼承
繼承有參構造函數,則super就不能隱式了,要用super直接調用用父類的有參構造函數class
調用父類的通常方法用super.父類方法名,調用父類構造用super(父類方法名);變量
同時,super語句和this語句同樣,放在子類構造函數的第一行;構造函數
子類一實例化,就會去找父類。方法
以下:
public class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(); Zi z1 = new Zi(3); } } class Fu { Fu(int x) { System.out.println("show fu" + x); } } class Zi extends Fu { Zi() { // super() 隱式語句 super(3); // 調用父類對應的構造函數 System.out.println("show zi"); } Zi(int x) { // super() super(5); // 調用父類對應的構造函數 System.out.println("zi..." + x); } }
輸出:
show fu3
show zi
show fu5
zi...3
public class ExtendsDemo1 { public static void main(String[] args) { Student student = new Student("nike"); student.show(); } } class Person { String name; Person(String name) { this.name = name; } void show() { System.out.println(name +"......"+ "go"); } } class Student extends Person { Student(String name) { super(name); //調用父類的變量 } void show() { super.show(); //調用父類的方法 } }
輸出:
nike......go
子類的構造函數第一行,也能夠用this設備名手動指定訪問本類中的構造函數。子類中會有一個構造函數,會訪問父類中的構造函數。
public class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(7); } } class Fu { Fu(int x) { // 父類初始化後,m初始值變成了11 System.out.println(x); } } class Zi extends Fu { Zi() { //super(); //隱式語句 super(5); // 調用父類對應的構造函數 System.out.println("show zi"); } Zi(int x) { this();//調用Zi(),同時再也不有super(),由於super()只能在第一行 System.out.println("zi..." + x); } }
輸入出:
5show zizi...7