Java 從入門到進階之路(八)
在之前的文章我們介紹了一下 Java 中的過載,接下來我們看一下 Java 中的構造方法。
我們之前說過,我們在定義一個變數的時候,java 會為我們提供一個預設的值,字串為 null,數字為 0。如下:
1 public class HelloWorld { 2 public static void main(String[] args) { 3 User e = new User(); // 建立一個 User 物件 4 e.print(); // 姓名:null 年齡:0 性別:null 5 } 6 } 7 8 class User { 9 String name; 10 int age; 11 String gender; 12 13 void print() { 14 System.out.print("姓名:" + name + "年齡:" + age + "性別:" + gender); 15 } 16 }
但是我們往往在使用的時候並不是想用預設的值,而是自己去定義我們想要的值,如下:
1 public class HelloWorld { 2 public static void main(String[] args) { 3 // 建立一個 zs 的 User 物件 4 User zs = new User(); 5 zs.name = "張三"; 6 zs.age = 20; 7 zs.gender = "男"; 8 zs.print(); // 姓名:張三 年齡:20 性別:男 9 10 // 建立一個 ls 的 User 物件 11 User ls = new User(); 12 ls.name = "李四"; 13 ls.age = 22; 14 ls.gender = "女"; 15 ls.print(); // 姓名:李四 年齡:22 性別:女 16 } 17 } 18 19 class User { 20 String name; 21 int age; 22 String gender; 23 24 void print() { 25 System.out.print("姓名:" + name + "年齡:" + age + "性別:" + gender); 26 } 27 }
在上面的程式碼中,我們每次例項化一個 User 物件並賦值時,都要重複寫很多程式碼,造成程式碼冗餘,我們可以將初始化引數也一併寫到隊形的方法內來解決,如下:
1 public class HelloWorld { 2 public static void main(String[] args) { 3 // 建立一個 zs 的 User 物件 4 User zs = new User(); 5 zs.userInfo("張三", 20, "男"); 6 zs.print(); // 姓名:張三 年齡:20 性別:男 7 8 // 建立一個 ls 的 User 物件 9 User ls = new User(); 10 ls.userInfo("李四", 22, "女"); 11 ls.print(); // 姓名:李四 年齡:22 性別:女 12 } 13 } 14 15 class User { 16 String name; 17 int age; 18 String gender; 19 20 void userInfo(String name, int age, String gender) { 21 this.name = name; 22 this.age = age; 23 this.gender = gender; 24 } 25 26 void print() { 27 System.out.print("姓名:" + name + "年齡:" + age + "性別:" + gender); 28 } 29 }
在上面的程式碼中,我們定義了一個 userInfo( ) 的方法,通過賦值的形式將引數初始化,其中 this.name = name 中的 this 關鍵字表示的是 呼叫改方法的那個物件,即 User,我們可以將其淺顯地理解為 zs.name = name;或者 ls.name = name;這樣我們在建立 User 例項後通過呼叫 userInfo( ) 方法來賦值。
通過以上方法我們就可以有效地減少我們在做初始化引數值的時候的程式碼冗餘。
Java 其實已經為我們提供了更為簡單的方法:構造方法。如下
1 public class HelloWorld { 2 public static void main(String[] args) { 3 // 建立一個 zs 的 User 物件 4 User zs = new User("張三", 20, "男"); 5 zs.print(); // 姓名:張三 年齡:20 性別:男 6 7 // 建立一個 ls 的 User 物件 8 User ls = new User("李四", 22, "女"); 9 ls.print(); // 姓名:李四 年齡:22 性別:女 10 } 11 } 12 13 class User { 14 String name; 15 int age; 16 String gender; 17 18 User(String name, int age, String gender) { 19 this.name = name; 20 this.age = age; 21 this.gender = gender; 22 } 23 24 void print() { 25 System.out.print("姓名:" + name + "年齡:" + age + "性別:" + gender); 26 } 27 }
我們將 void userInfo() 方法改為了和類名 User 一樣的 User( ),然後在初始化例項的時候直接將引數傳入,使程式碼更加簡潔。
其實我們之前一直寫的 User zs = new User( ) 就是一個無引數構造方法。
在有的時候,我們常常會根據也無需要來傳遞自己想要的引數,類似於之前提到的視窗支付問題,那就需要用到過載,構造方法也是可以過載的,如下:
1 public class HelloWorld { 2 public static void main(String[] args) { 3 // 建立一個 zs 的 User 物件 4 User zs = new User(); 5 zs.print(); // 姓名:null 年齡:0 性別:null 6 7 // 建立一個 ls 的 User 物件 8 User ls = new User("李四", 22, "女"); 9 ls.print(); // 姓名:李四 年齡:22 性別:女 10 } 11 } 12 13 class User { 14 String name; 15 int age; 16 String gender; 17 18 User(){ 19 20 } 21 22 User(String name, int age, String gender) { 23 this.name = name; 24 this.age = age; 25 this.gender = gender; 26 } 27 28 void print() { 29 System.out.print("姓名:" + name + "年齡:" + age + "性別:" + gender); 30 } 31 }
我們對構造方法的 User( ) 進行了過載,這樣就可以根據需求來初始化自己想要的引數了。
構造方法的定義與約束:
1、常常用於給成員變數賦初始值
2、與類同名,沒有返回型別
3、在建立(new)物件時被自動呼叫
4、若自己不寫構造方法,則編譯器預設提供無參構造,若自己寫了構造,則不再預設提供。
5、構造方法可以過載
&n