<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 中的構造函數 - 一個完整的研究 > 原文: [https://beginnersbook.com/2013/03/constructors-in-java/](https://beginnersbook.com/2013/03/constructors-in-java/) 構造函數是一個初始化新創建對象的代碼塊。構造函數類似于 java 中的實例方法,但它不是一個方法,因為它沒有返回類型。簡而言之,構造函數和方法是不同的(本指南末尾有更多內容)。人們經常在 Java 中將構造函數稱為特殊類型的方法。 構造函數與類具有相同的名稱,在 java 代碼中看起來像這樣。 ```java public class MyClass{ //This is the constructor MyClass(){ } .. } ``` > 請注意,構造函數名稱與類名稱匹配,并且它沒有返回類型。 ## 構造函數如何工作 為了理解構造函數的工作,我們舉個例子。假設我們有一個類`MyClass`。 當我們像這樣創建`MyClass`的對象時: ```java MyClass obj = new MyClass() ``` **`new`關鍵字**在這里創建類`MyClass`的對象并調用構造函數來初始化這個新創建的對象。 你可能會在這里丟失一些,因為我沒有向你展示任何初始化示例,讓我們看看下面的代碼: ### java 中的一個簡單的構造函數程序 這里我們創建了類`Hello`的對象`obj`,然后我們顯示了對象的實例變量`name`。正如您所看到的那樣,輸出是`BeginnersBook.com`,這是我們在構造函數初始化期間傳遞給`name`的內容。這表明當我們創建對象`obj`時,構造函數被調用了。在這個例子中我們使用了**`this`關鍵字**,它引用了當前對象,在這個例子中是對象`obj`。我們將在下一個教程中詳細介紹`this`關鍵字。 ```java public class Hello { String name; //Constructor Hello(){ this.name = "BeginnersBook.com"; } public static void main(String[] args) { Hello obj = new Hello(); System.out.println(obj.name); } } ``` **輸出:** ```java BeginnersBook.com ``` ![new keyword invoked the constructor](https://img.kancloud.cn/26/f7/26f72d1dcda0b7382d40891838d3d032_500x300.jpg) ## 構造函數的類型 構造函數有三種類型:默認,無參和參數化構造函數和。 ![types of constructor](https://img.kancloud.cn/8a/e2/8ae273521100357f7ae51d0c89ab1dfb_500x200.jpg) ### 默認構造函數 如果您沒有在類中實現任何構造函數,Java 編譯器會代表您將[默認構造函數](https://beginnersbook.com/2014/01/default-constructor-java-example/)插入到代碼中。此構造函數稱為默認構造函數。您不會在源代碼(java 文件)中找到它,因為它將在編譯期間插入到代碼中并存在于`.class`文件中。該過程如下圖所示: ![default constructor](https://img.kancloud.cn/51/ee/51ee6ce1be0d53b63dda1d9a953fdd77_750x250.jpg) > 如果實現任何構造函數,則不再從 Java 編譯器接收默認構造函數。 ### 無參數構造函數: 沒有參數的構造函數稱為 **無參構造函數**。簽名與默認構造函數相同,但是正文可以具有任何代碼,而不像構造函數的主體為空的默認構造函數。 > 雖然你可能會看到有些人聲稱默認和無參構造函數是相同的,但實際上它們不是,即使你在類`Demo`中編寫 **`public Demo(){}`** 它也無法調用默認構造函數,因為你已經編寫了它的代碼。 #### 示例:無參構造函數 ```java class Demo { public Demo() { System.out.println("This is a no argument constructor"); } public static void main(String args[]) { new Demo(); } } ``` 輸出: ``` This is a no argument constructor ``` ### 參數化構造函數 帶參數的構造函數(或者你可以說參數)被稱為[參數化構造函數](https://beginnersbook.com/2014/01/parameterized-constructor-in-java-example/)。 #### 示例:參數化構造函數 在這個例子中,我們有一個帶有兩個參數`id`和`name`的參數化構造函數。在創建對象`obj1`和`obj2`時,我傳遞了兩個參數,以便在創建`obj1`和`obj2`之后調用此構造函數。 ```java public class Employee { int empId; String empName; //parameterized constructor with two parameters Employee(int id, String name){ this.empId = id; this.empName = name; } void info(){ System.out.println("Id: "+empId+" Name: "+empName); } public static void main(String args[]){ Employee obj1 = new Employee(10245,"Chaitanya"); Employee obj2 = new Employee(92232,"Negan"); obj1.info(); obj2.info(); } } ``` **輸出:** ```java Id: 10245 Name: Chaitanya Id: 92232 Name: Negan ``` #### 示例 2:參數化構造函數 在這個例子中,我們有兩個構造函數,一個默認構造函數和一個參數化構造函數。當我們在使用`new`關鍵字創建對象時不傳遞任何參數時,將調用默認構造函數,但是當您傳遞參數時,將調用與傳遞的參數列表匹配的參數化構造函數。 ```java class Example2 { private int var; //default constructor public Example2() { this.var = 10; } //parameterized constructor public Example2(int num) { this.var = num; } public int getValue() { return var; } public static void main(String args[]) { Example2 obj = new Example2(); Example2 obj2 = new Example2(100); System.out.println("var is: "+obj.getValue()); System.out.println("var is: "+obj2.getValue()); } } ``` **輸出:** ```java var is: 10 var is: 100 ``` ## 如果在類中僅實現參數化構造函數,該怎么辦? ```java class Example3 { private int var; public Example3(int num) { var=num; } public int getValue() { return var; } public static void main(String args[]) { Example3 myobj = new Example3(); System.out.println("value of var is: "+myobj.getValue()); } } ``` **輸出**:會拋出編譯錯誤。原因是,語句`Example3 myobj = new Example3()`正在調用我們程序中沒有的默認構造函數。當您沒有在類中實現任何構造函數時,編譯器會將默認構造函數插入到您的代碼中,但是當您實現任何構造函數時(在上面的示例中,我已經使用`int`參數實現了參數化構造函數),那么您不會收到默認構造函數通過編譯器進入你的代碼。 如果我們從上面的代碼中刪除參數化構造函數,那么程序運行正常,因為編譯器會將默認構造函數插入到代碼中。 ## 構造函數鏈接 當構造函數調用同一個類的另一個構造函數時,這稱為構造函數鏈接。在[這里閱讀更多相關信息](https://beginnersbook.com/2013/12/java-constructor-chaining-with-example/)。 ![constructor chaining](https://img.kancloud.cn/be/56/be56858bc38feaa35f77a8c5ffb12cf4_500x450.jpg) ## `super()` 每當調用子類構造函數時,它都會隱式調用父類的構造函數。您還可以說編譯器在子類構造函數的開頭插入`super();`語句。 ```java class MyParentClass { MyParentClass(){ System.out.println("MyParentClass Constructor"); } } class MyChildClass extends MyParentClass{ MyChildClass() { System.out.println("MyChildClass Constructor"); } public static void main(String args[]) { new MyChildClass(); } } ``` **輸出:** ```java MyParentClass Constructor MyChildClass Constructor ``` 在這里閱讀更多關于[`super`關鍵字的信息](https://beginnersbook.com/2014/07/super-keyword-in-java-with-example/)。 ## 構造函數重載 構造函數重載是一個具有多個具有不同參數列表的構造函數的概念,以這種方式使每個構造函數執行不同的任務。 ![constructor overloading](https://img.kancloud.cn/0d/62/0d62dc3d2a06303ecd76a9956e959911_500x300.jpg) 有關詳細信息,請參閱示例的[構造函數重載](https://beginnersbook.com/2013/05/constructor-overloading/)。 ## Java 復制構造函數 復制構造函數用于將一個對象的值復制到另一個對象。 ```java class JavaExample{ String web; JavaExample(String w){ web = w; } /* This is the Copy Constructor, it * copies the values of one object * to the another object (the object * that invokes this constructor) */ JavaExample(JavaExample je){ web = je.web; } void disp(){ System.out.println("Website: "+web); } public static void main(String args[]){ JavaExample obj1 = new JavaExample("BeginnersBook"); /* Passing the object as an argument to the constructor * This will invoke the copy constructor */ JavaExample obj2 = new JavaExample(obj1); obj1.disp(); obj2.disp(); } } ``` 輸出: ```java Website: BeginnersBook Website: BeginnersBook ``` ## 快速回顧 1. 每個類都有一個構造函數,無論它是普通類還是抽象類。 2. 構造函數不是方法,它們沒有任何返回類型。 3. 構造函數名稱應與類名匹配。 4. 構造函數可以使用任何訪問說明符,也可以將它們聲明為私有。私有構造函數在 java 中是可能的,但是范圍只在類中。 5. **類似構造函數方法也可以具有與類名相同的名稱,但它們仍然具有返回類型,盡管我們可以識別它們是方法而不是構造函數。** 6. 如果你沒有在類中實現任何構造函數,編譯器將執行它。 7. **`this()`和`super()`應該是構造函數代碼中的第一個語句。** 如果您不提及它們,編譯器會相應地為您執行此操作。 8. 構造函數重載是可能的,但是無法覆蓋。這意味著我們可以在類中重載構造函數,但是我們不能覆蓋構造函數。 9. 構造函數不能被繼承。 10. 如果超類沒有無參(默認)構造函數,那么編譯器不會像在正常情況下那樣在子類中插入默認構造函數。 11. 接口[沒有構造函數](https://beginnersbook.com/2013/12/java-constructor-in-interface/)。 12. 抽象類可以有構造函數,當實現接口的類被實例化時,它會被調用。 (即具體類的對象創建)。 13. 構造函數也可以調用同一個類的另一個構造函數 - 使用`this()`。如果你想調用一個參數化的構造函數,那么就這樣做: **`this(params)`**。 **有關構造函數的更多信息:** * [私有構造函數](https://beginnersbook.com/2013/12/java-private-constructor-example/) * [我們可以在 Java 中使用靜態構造函數嗎?](https://beginnersbook.com/2013/05/static-constructor/) ## 構造函數和方法之間的區別 我知道我應該在本指南的開頭提到它,但我想要涵蓋流程中的所有內容。希望你不要介意:) 1. 構造函數的目的是初始化類的對象,而方法的目的是通過執行 java 代碼來執行任務。 2. 方法可以是構造函數,不能是抽象的,最終的,靜態的和同步的。 3. 當方法有時,構造函數沒有返回類型。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看