1. 程式人生 > >Java構造器(構造方法/constructor)

Java構造器(構造方法/constructor)

  我們先來看一下什麼是構造器:

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