構造器是什么
1.構造器,也稱構造方法、構造函數。作用是構造出來一個類的實例,確保對象得到初始化。
2.構造器的格式: 權限修飾符 類名(無參/有參){}
。
3.根據有無參數,可分為無參構造 和有參構造。
構造器的特性
1.與一般方法名不同的是,構造方法名必須和類名保持一致,並且沒有返回值。
2.Java編譯器會自動創建無參構造函數,因此在類中,無參構造即使沒有,我們也可省略不寫。實例化對象時無需賦值。
3.倘若類中已存在有參構造函數,則編譯器不再提供默認無參構造。實例化對象時需賦值,不然報錯。
4.當類實例化一個對象時會自動調用構造方法。
示例代碼一:無參構造
學生類
public class Student {
//權限修飾符是public,表示內部屬性能被其他類訪問到。若使用private,則需要set/get才能訪問
public String name;
public int age;
//無參構造,編譯器自帶,可不寫。
public Student(){
System.out.println("括號內無參數,這就是無參構造");
}
}
測試類
public class Test {
public static void main(String[] args) {
Student st = new Student();//創建對象,括號內無需賦值
//沒賦值的情況下,字符類型默認值為null,數值類型默認值為0
System.out.println(st.name+" "+st.age);//null,0
//對屬性進行賦值
st.name="Tom貓";
st.age=5;
System.out.println(st.name+"今年"+st.age+"歲了");
}
}
結果
括號內無參數,這就是無參構造
null 0
Tom貓今年5歲了
示例代碼二:有參構造
學生類
public class Student {
//權限修飾符是public,表示內部屬性能被其他類訪問到。若使用private,則需要set/get才能訪問
public String name;
public int age;
//無參構造最好也寫上
public Student(){
}
public Student(String name,int age){
System.out.println("括號內有參數,就是有參構造");
//將形參變量的值,賦給成員變量。
this.name = name;
this.age = age;
//this.name = "吳邪" 若直接在構造方法內部賦值,則優先執行其內部的值,即吳邪會替掉Tom貓
}
}
測試類
public class Test {
public static void main(String[] args) {
//創建對象。賦值后,定義的值會傳遞給構造器中的形參變量。
Student st = new Student("Tom貓",5);//創建對象,須在括號內賦值,不然報錯
//使用對象調用成員變量(java對象只能調用成員變量)
System.out.println(st.name+"今年 "+st.age+"歲了");
}
}
結果
括號內有參數,就是有參構造
Tom貓今年5歲了
補充
如果你創造了一個帶有參數的構造方法,那么無參的構造方法必須顯式的寫出來,否則會編譯失敗。這句話該如何理解?
這句話其實有點不妥,應該這么理解:每個類至少要有一個構造函數。如果寫了一個有參構造,而沒有寫無參構造,也是可以的。不過,當你嘗試通過一個無參構造來new對象時,編譯器會報錯。因為找不到這個無參的構造函數。也就是說,當一個類你沒有寫構造函數時,編譯器會自動幫你創建一個無參構造。反之,若是寫了有參構造,卻想通過無參構造new對象,那么就需要將此無參構造寫出來。
java中,子類為什么會自動繼承父類的無參構造方法?
其實這句話本身就是錯誤的。因為構造函數不能繼承,只能被調用。 正確的說法應該是,Java中子類會自動調用父類的無參構造方法。那么,子類為什么會自動調用父類的無參構造方法呢?因為子類繼承父類,會繼承到父類中的數據,所以必須要看父類是如何對自己的數據進行初始化的。所以子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程。子類在繼承父類時,如果沒有相同的帶參構造方法,那么他就需要在其構造方法中,明確的通過super()調用父類的帶參構造方法,否則構造不出父類,從而也構造不出他自己了。如果我們在父類中寫個不帶參數的構造方法,就可以不用實現父類的帶參構造方法了。