getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)
作者:CHAITANYA SINGH
來源:通過示例學習Java編程(14):Java中的構造函數-方家話題
構造函數是用來初始化新創建的對象的代碼塊。構造函數類似于java中的實例方法(Instance Method),但它不是一個方法(Method),因為它沒有返回類型。簡而言之,構造函數和方法是不同的(在本指南的末尾將有更多的介紹)。人們經常把Java中的構造函數稱為特殊類型的方法。
構造函數的名稱必須與與類名相同,如下圖中的java代碼所示:public class MyClass{//This is the constructorMyClass(){}..}
注意,構造函數名與類名必須一致,并且沒有返回類型。
構造函數是如何工作的?
下面我們通過一個例子來幫助大家理解構造函數的工作原理。我們先創建一個名字叫MyClass的類:
MyClass obj = new MyClass();
以上代碼的意思就是通過new關鍵字來創建類MyClass的對象并調用這個類的構造函數來初始化這個新創建的對象,然后把這個對象賦值給對象變量obj。語句new MyClass()表示創建一個新的關于類MyClass的對象并調用構造函數來初始化這個新創建的對象。
下面我們來通過代碼實例來解釋什么是新創建對象的初始化。
一個簡單的java構造函數程序
這里我們基于類Hello創建了一個對象obj,然后我們顯示這個對象的實例變量name的值。在構造函數里面,我們給變量name賦值“BeginnersBook.com”,在賦值語句里面的this關鍵字表示引用當前的對象。我們將在下一個教程中詳細介紹this關鍵字。
public class Hello {String name;//ConstructorHello(){this.name = "BeginnersBook.com";}public static void main(String[] args) {Hello obj = new Hello();System.out.println(obj.name);}}
輸出:
BeginnersBook.com
構造函數的類型
構造函數有三種類型:默認構造函數、無參數構造函數和參數化構造函數。
默認構造函數
如果在類(class)中沒有定義代碼來實現任何構造函數,Java編譯器將會在編譯的字節碼里面為你插入默認構造函數。不會在源代碼(java文件)中找到它,因為默認構造函數是在編譯期間由編譯器插入到代碼中,并且存在于.class文件中,所以你在源代碼(java文件)里面是看不到這個默認構造函數的。這個過程如下圖所示:
注:如果你在類(class)里面實現了任何構造函數,那么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
參數化構造函數
帶參數的構造函數稱為參數化構造函數。
示例1:參數化構造函數
在這個例子中,我們定義的類Employee里面有一個帶有兩個參數(id,name)的參數化構造函數。用這個類Employee創建兩個對象,obj1和obj2,在創建obj1和obj2時都調用了這個參數化構造函數,分別往里面傳了兩套不同的參數:10245、"Chaitanya"和92232、"Negan",傳進去的參數都賦值給了類的成員變量empId和empName,后面的代碼把obj1和obj2的empId和empName分別打印出來,見下圖:
public class Employee {int empId; String empName; //parameterized constructor with two parametersEmployee(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(); } }
輸出:Id: 10245 Name: ChaitanyaId: 92232 Name: Negan
例2:參數化構造函數
在這個例子中,我們有兩個構造函數,一個默認構造函數和一個參數化構造函數。當我們在使用new關鍵字創建對象而且不傳遞任何參數時,系統將調用默認構造函數,但是如果我們在使用new關鍵字創建對象的時候傳遞了參數,那么系統將調用與傳遞的參數列表匹配的參數化構造函數。
class Example2{private int var;//default constructorpublic Example2(){this.var = 10;}//parameterized constructorpublic 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());}}
輸出:
var is: 10var is: 100
如果我們類中只實現了參數化構造函數,而沒有實現默認構造函數(不帶參數的),會發生什么?
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();中,我們調用了類Example3里面的不含參數的默認構造函數,還記得我們在上面提到的,一旦我們在類里面有實現帶參數的構造函數,那么編譯器就不會自動在背后給我們插入不含參數的默認構造函數,而代碼new Example3();調用了類(class)Example3的不存在的默認構造函數,當然編譯就會報錯啦!
如果我們從上面的代碼中刪除參數化構造函數的實現代碼,那么程序編譯和運行都不會有問題,因為編譯器會在編譯的過程中將默認構造函數插入到您的代碼中。
構造函數鏈
當構造函數調用同一個類的另一個構造函數時,這稱為構造函數鏈,見下圖:
super()
每當我們調用子類構造函數時,它都隱式地調用了父類的構造函數,可以把這理解為編譯器在子類構造函數的開頭插入了super();語句。
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();}}
輸出:
MyParentClass ConstructorMyChildClass Constructor
構造函數重載
構造函數重載指的是同一個類里面定義實現了多個不同參數列表的構造函數,雖然這些構造函數的名字都是一樣的(和類名一樣),但在創建這個類的對象的時候,如果傳進去的參數不同,調用的構造函數也是不同的。
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(); } }
輸出:Website: BeginnersBookWebsite: BeginnersBook
要點回顧:
1. 每個類都有一個構造函數,不管它是普通類還是抽象類。
2. 構造函數不是方法,它們沒有任何返回類型。
3. 構造函數名應該與類名匹配。
4. 構造函數可以使用任何訪問說明符,它們也可以聲明為私有。在java中可以使用私有構造函數,但是私有構造函數的作用域局限在類里面。
5. 我們也可以定義一個和類名相同的方法,但方法必須要定義返回值的數據類型,我們可以據此判斷和類名相同的方法和構造函數的區別。
6. 如果我們沒有在類中定義和實現任何構造函數,編譯器就會在編譯的時候自動在后臺的代碼中插入默認構造函數。
7. this()和super()這兩個語句如果放在構造函數代碼里面,一定要放在構造函數代碼里面的第一行。如果我們的代碼里面沒有這兩個語句,編譯器會在后臺的代碼中自動插入這兩個語句。
8. 構造函數可以重載(overload),但不能重寫(override)。這意味著我們可以在類中重載(overload)構造函數,但不能重寫(override)構造函數。
9. 構造函數不能繼承。
10. 如果父類(super class)沒有定義無參數構造函數(默認構造函數),那么編譯器也不會自動在子類(child class)的后臺代碼里面自動插入默認構造函數。
11. 接口沒有構造函數。
12. 抽象類可以有構造函數,抽象類的構造函數在創建具體類的對象的時候被調用到。
13. 構造函數代碼里面還可以調用同一個類的另一個構造函數,使用方法就是通過調用this()方法,例如,在一個構造函數里面要調用另一個帶參數的構造函數,可以用這樣的寫法:this(parameter list),這里parameter list就是傳進去的幾個參數。
構造函數(constructor)與方法(method)的區別
1. 構造函數的目的是初始化類的對象,而方法的目的是通過執行java代碼來執行任務。
2. 構造函數不能是抽象的(abstract)、最終的(final)、靜態的(static)和同步的(synchronised),而方法則可以是。
3. 構造函數沒有返回類型,而方法有返回類型。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 电脑端京东的我的订单html+css页面
- 下一篇: 苹果手机怎么设置时间24小时制_8款手机