Java構造器(構造方法/constructor)
阿新 • • 發佈:2020-04-05
我們先來看一下什麼是構造器:
1、構造器也叫構造方法或建構函式,分為有參構造器和無參構造器;
2、構造器也是一種方法,只不過是一種特殊的方法,它會在物件建立的時候被呼叫;
3、構造器最大的作用就是在建立物件的時候進行物件的初始化,有參構造器可以實現物件傳參(後面會比較著來看有參構造器方便在哪兒了);
4、一個類可以有零個(如果沒有自己定義編譯器會幫你提供無參構造器)或多個構造器(【過載】不知道過載定義的小夥伴可以先記下概念);
5、構造器不能被子類繼承,Java中子類會自動呼叫父類的構造器(同樣,不瞭解的可以先記下概念或者跳過)
前面既然說了構造器是一種特殊的方法,我們就來看一下構造方法和普通方法的區別:
1、命名:構造器的方法名必須和類名相同,一般方法的方法名在命名規範的情況下可以隨便定義。
2、修飾符:構造器不能被static、final、synchronized、abstract和native修飾
3、返回值:構造器沒有返回值(但是不需要寫void),一般方法要有返回值或者無返回值(void)
來看一下無參構造器的程式碼,同時看一下無參構造器的情況下(不定義構造器同理)是如何給屬性賦值的:
1 package test; 2 3 public class Student01 { 4 //定義屬性 5 public String name; 6 public int age; 7 public String sex; 8 9 /** 10 * 無參的構造方法: 11 * 如果不寫編譯器會自動加上;只要定義了構造器,不管是有參還是無參,編譯器都不會再幫你定義 12 */ 13 public Student01() {//new物件的時候會呼叫這個無參構造方法,它會給new出來的物件一個初始化值(瞭解即可:數字為 0,字元為 null,布林為 false,所有引用都是 null) 14 System.out.println("建立物件的過程中呼叫我了,在s1.name = ‘張三’;前執行,所以我在main方法的列印語句前列印"); 15 } 16 17 public static void main(String[] args) { 18 Student01 s1 = new Student01();//執行這一步的時候會自動呼叫Student01() 19 //通過 物件.屬性來給屬性賦值 20 s1.name = "張三"; 21 s1.age = 18; 22 s1.sex = "男"; 23 System.out.println("姓名:"+s1.name+"\n性別:"+s1.sex+"\n年齡:"+s1.age); 24 } 25 26 }結果:
建立物件的過程中呼叫我了,在s1.name = ‘張三’;前執行,所以我在main方法的列印語句前列印
姓名:張三
性別:男
年齡:18
再來看有參構造器(給屬性賦值不用再一個一個通過物件.屬性)
1 package test; 2 3 public class Student02 { 4 // 定義屬性 5 public String name; 6 public int age; 7 public String sex; 8 9 //定義有參構造方法 10 public Student02(String name, int age, String sex) { //類似於普通帶參方法 public void add(int a,int b){} 11 this.name = name; //將形參變數的值,賦給成員變數。 this指當前物件,這裡不會的小夥伴不用慌它們的意思是: 12 this.age = age; //拿name來舉例this.name = name;就是將下面傳過來的name值(張翠花)賦值給上面定義屬性的(public String name;)name 13 this.sex = sex; 14 } 15 16 public static void main(String[] args) { 17 Student02 s2 = new Student02("張翠花", 18, "女");//呼叫構造器的時候傳參(改變預設初始化),類似於呼叫普通帶參方法 add(1,1); 18 System.out.println("姓名:"+s2.name+"\n性別:"+s2.sex+"\n年齡:"+s2.age); 19 } 20 21 }
構造器不只可以定義一個,可以是零個(以前建立物件沒寫構造器的時候)或多個
1 package test; 2 3 public class Student02 { 4 // 定義屬性 5 public String name; 6 public int age; 7 public String sex; 8 9 //定義有參構造方法 10 public Student02(String name, int age, String sex) { //類似於普通帶參方法 public void add(int a,int b){} 11 this.name = name; 12 this.age = age; 13 this.sex = sex; 14 } 15 16 //定義無參構造方法 17 public Student02() { 18 19 } 20 21 //定義一個兩個引數的構造方法(過載)不能和剛才的一樣 注意:名字依然要和類名保持一致 22 public Student02(String name, String sex){ 23 this.name = name; 24 this.sex = sex; 25 } 26 27 public static void main(String[] args) { 28 Student02 s2 = new Student02("張翠花", 18, "女");//呼叫構造器的時候傳參,類似於呼叫普通帶參方法 add(1,1); 29 System.out.println("姓名:"+s2.name+"\n性別:"+s2.sex+"\n年齡:"+s2.age); 30 31 System.out.println("---------------------"); 32 33 //建立一個新的物件 34 Student02 s3 = new Student02("石榴姐", "女");//這裡可以用前面三個構造器的任意一個 35 System.out.println("姓名:"+s3.name+"\n性別:"+s3.sex+"\n年齡:"+s3.age); 36 //因為這裡用的是沒有給年齡傳值的構造器,所以列印的年齡是初始值0 37 } 38 39 }
結果:
姓名:張翠花
性別:女
年齡:18
---------------------
姓名:石榴姐
性別:女
年齡:0
&n