Java面向對象-構造方法,this關鍵字
構造方法
概念:構造方法是一個特殊的方法,這個特殊方法用於創建實例時執行初始化操作;
上代碼:
1 package com.java1234.chap03.sec04; 2 3 /** 4 * 定義人類 5 * @author user 6 * 7 */ 8 public class People { 9 10 // 定義屬性 11 private String name; // 實例化對象時,默認值是null 12 private int age; // 實例化對象時,默認值是0 13 14 /** 15 * 默認構造方法 16 */ 17 People(){ 18 System.out.println("默認構造方法!"); 19 } 20 21 22 23 public void say(){ 24 System.out.println("我叫:"+name+",我今年:"+age); 25 } 26 27 public static void main(String[] args) { 28 People people=new People(); 29 people.say(); 30 } 31 }
運行輸出:
默認構造方法!
我叫:null,我今年:0
這里我們發現: 實例化對象的時候,String類型的默認值是null,int基本類型的默認值是0 ;
People(){} 構造方法
特點 1,沒有返回值類型,區別於其他一般方法;
2,方法名和類名一樣;
我們現在可以寫一個有參數的構造方法,用來初始化對象屬性;
1 package com.java1234.chap03.sec04; 2 3 /** 4 * 定義人類 5 * @author user 6 * 7 */ 8 public class People { 9 10 // 定義屬性 11 private String name; // 實例化對象時,默認值是null 12 private int age; // 實例化對象時,默認值是0 13 14 /** 15 * 默認構造方法 16 */ 17 People(){ 18 System.out.println("默認構造方法!"); 19 } 20 21 /** 22 * 有參數的構造方法 23 * @param name2 24 * @param age2 25 */ 26 People(String name2,int age2){ 27 System.out.println("調用的是有參數的構造方法"); 28 name=name2; 29 age=age2; 30 } 31 32 public void say(){ 33 System.out.println("我叫:"+name+",我今年:"+age); 34 } 35 36 public static void main(String[] args) { 37 // People people=new People(); 38 People people=new People("張三",20); 39 people.say(); 40 } 41 }
運行結果
調用的是有參數的構造方法
我叫:張三,我今年:20
這里我們定義了一個有參數的構造方法,參數有name2 age2,當調用構造方法的時候,用於賦值給name和age屬性;
注意點:
1,假如沒有構造方法,系統會自動生成一個默認的無參構造方法;
上代碼,我們去掉剛才定義的People(){}
1 package com.java1234.chap03.sec04; 2 3 /** 4 * 定義人類 5 * @author user 6 * 7 */ 8 public class People { 9 10 // 定義屬性 11 private String name; // 實例化對象時,默認值是null 12 private int age; // 實例化對象時,默認值是0 13 14 /** 15 * 默認構造方法 16 */ 17 /*People(){ 18 System.out.println("默認構造方法!"); 19 }*/ 20 21 /** 22 * 有參數的構造方法 23 * @param name2 24 * @param age2 25 */ 26 /*People(String name2,int age2){ 27 System.out.println("調用的是有參數的構造方法"); 28 name=name2; 29 age=age2; 30 }*/ 31 32 public void say(){ 33 System.out.println("我叫:"+name+",我今年:"+age); 34 } 35 36 public static void main(String[] args) { 37 People people=new People(); 38 //People people=new People("張三",20); 39 people.say(); 40 } 41 }
我們把兩個構造方法注釋了,運行的話,依然沒問題。
2,假如有構造方法,系統不會自動生成構造方法;
假如我們單獨去掉無參數的構造方法,上代碼:
1 package com.java1234.chap03.sec04; 2 3 /** 4 * 定義人類 5 * @author user 6 * 7 */ 8 public class People { 9 10 // 定義屬性 11 private String name; // 實例化對象時,默認值是null 12 private int age; // 實例化對象時,默認值是0 13 14 15 /** 16 * 有參數的構造方法 17 * @param name2 18 * @param age2 19 */ 20 People(String name2,int age2){ 21 System.out.println("調用的是有參數的構造方法"); 22 name=name2; 23 age=age2; 24 } 25 26 public void say(){ 27 System.out.println("我叫:"+name+",我今年:"+age); 28 } 29 30 public static void main(String[] args) { 31 People people=new People(); 32 //People people=new People("張三",20); 33 people.say(); 34 } 35 }
我們會發現編譯報錯了:

The constructor People() is undefined
說找不到People()構造方法
this關鍵字
this表示當前對象
1,使用this調用本類中的屬性和方法;
2,使用this調用構造方法;
我們上面的例子
1 People(String name2,int age2){ 2 System.out.println("調用的是有參數的構造方法"); 3 name=name2; 4 age=age2; 5 }
構造方法的屬性名和類里的屬性名不一致; 假如說我們搞成一致;

這里警告的意思 是自己賦值給自己 沒有意義,這里的name和age變量 作用范圍在方法里 所以和類里的屬性名搭不上邊;
我們如何才行指定類里的屬性呢,這時候this關鍵字派上用場了。
我們可以用this關鍵字類執行當前對象 this.屬性 實現;
上代碼:
1 package com.java1234.chap03.sec04; 2 3 /** 4 * 定義人類 5 * @author user 6 * 7 */ 8 public class People { 9 10 // 定義屬性 11 private String name; // 實例化對象時,默認值是null 12 private int age; // 實例化對象時,默認值是0 13 14 /** 15 * 默認構造方法 16 */ 17 /*People(){ 18 System.out.println("默認構造方法!"); 19 }*/ 20 21 /** 22 * 有參數的構造方法 23 * @param name 24 * @param age 25 */ 26 People(String name,int age){ 27 System.out.println("調用的是有參數的構造方法"); 28 this.name=name; 29 this.age=age; 30 } 31 32 public void say(){ 33 System.out.println("我叫:"+name+",我今年:"+age); 34 } 35 36 public static void main(String[] args) { 37 // People people=new People(); 38 People people=new People("張三",20); 39 people.say(); 40 } 41 }
假如在我們還有需求,在構造方法中調用另外一個構造方法,比如默認構造方法里是基本的初始化,有參數的構造方法是附加初始化,
再調用有參數的構造方法時候,我們先調用無參數構造方法,實現基本初始化,然后再進行附加初始化,這時候this關鍵字又派上用場了,
我們調用this()就是調用無參數構造方法,括號里也可以加參數,來調用有參數的構造方法。
上代碼:
1 package com.java1234.chap03.sec04; 2 3 /** 4 * 定義人類 5 * @author user 6 * 7 */ 8 public class People { 9 10 // 定義屬性 11 private String name; // 實例化對象時,默認值是null 12 private int age; // 實例化對象時,默認值是0 13 14 /** 15 * 默認構造方法 16 */ 17 People(){ 18 System.out.println("默認構造方法!"); 19 } 20 21 /** 22 * 有參數的構造方法 23 * @param name 24 * @param age 25 */ 26 People(String name,int age){ 27 this(); // 調用無參數的構造方法 28 System.out.println("調用的是有參數的構造方法"); 29 this.name=name; 30 this.age=age; 31 } 32 33 public void say(){ 34 System.out.println("我叫:"+name+",我今年:"+age); 35 } 36 37 public static void main(String[] args) { 38 // People people=new People(); 39 People people=new People("張三",20); 40 people.say(); 41 } 42 }
運行輸出
默認構造方法!
調用的是有參數的構造方法
我叫:張三,我今年:20
