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、構造方法可以重載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM