我們先來看一下什么是構造器:
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
