- 特點:
- 函數名與類名相同
- 不用定義返回值類型
- 沒有具體的返回值
- 作用:
給對象進行初始化
- 注意:
- 默認構造函數
- 多個構造函數是以重載出現的
- 一個類中如果沒有定義過構造函數,那么該類中會有一個默認的空參數的構造函數
- 如果在類中定義了構造函數,那么類中的默認構造函數就沒有了
- 構造函數在創建對象時調用
- 構造函數也有默認的return語句(省略不寫)
- 函數執行到return語句后,棧中該函數的方法區就會出棧
如:
class Person{ PRivate int age; Person(){ age = 10; }}
- 一般函數和構造函數的區別
構造函數:對象創建時,就會調用對應的構造函數,對對象進行初始化
一般函數:對象創建后,需要函數功能時才調用
一般函數不能調用構造函數,構造函數可以調用一般函數
class Person{ void Person(){ }}此方法為一般方法
class Person{ private String name; private int age; Person(){ age = 1; name = "xiaoming"; } Person(int a, String n){ age = a; name = n; }public void speak(){
System.out.println(name+”:”+age);
}}
在newPerson對象時,可以根據不同的構造函數,選擇不同的創建方式。
Person p1 = new Person();//使用Person類的無參構造函數來創建對象Person p2 = new Person(10,”zhangsan”);//使用Person類有兩個參數的構造函數來創建對象p1.speak();
p2.speak();
運行結果為:
xiaoming:1
zhangsan:10
Person p2 = new Person(10,”zhangsan”);p2.speak();
這個代碼在內存中的執行過程:
說明:
1.執行main方法,在棧內存中開辟一個main函數的方法區,創建一個Person類型變量p2
2.在堆內存中創建一個Person的實例,并初始化值,和分配地址值
3.在棧內存中開辟Person構造函數的方法區,并執行構造函數中的代碼,即給堆內存中的Person實例的name和age屬性賦值
4.Person方法區出棧
5.棧中創建speak的方法區,執行相應的代碼
6.speak方法區出棧
構造函數可以調用構造函數,如:
class Person{ private String name; private int age; Person(String n){ name = n; } Person(String n, int a){ this(n); age = a; } public void speak(){ System.out.println(name+”:”+age); }}
注意:
- 對this的調用必須是構造函數中的第一個語句
- 不允許兩個構造函數互相調用,即不能Person(String n)中調用this(“zhangsan”,10),再在Person(String n, int a)調用this(“xiaoming”),會導致棧內存溢出,因為它們在不斷的互相調用,不斷進棧,卻沒有出棧
錯誤?。?!棧內存溢出:
class Person{ private String name; private int age; Person(String n){ this("zhangsan",10) name = n; } Person(String n, int a){ this("lisi"); age = a; } }
- this詳解見 [java學習筆記]java語言核心----this關鍵字&super關鍵字
新聞熱點
疑難解答