“部分內容摘自《java語言程序設計》,郭克華主編,page 77”
一、何爲構造函數
——構造函數也是一種特殊方法,避免創建對象後,忘記對對象進行初始化,是人爲創造的。它規定了對象初始化必須完成。
二、格式
類名 對象名 = new 類名(傳參)
定義時需要滿足:函數名稱與類名相同;不含有返回值
三、實例
/**
* 構造函數演示
*/
class Customer {
String name;
String sex;
int age;
void init(String name,String sex,int age){
this.name = name;
this.age = age;
this.sex = sex;
}
void display(){
System.out.println("name="+name);
System.out.println("age="+age);
System.out.println("sex="+sex);
}
}
public class ConstructorTest{
public static void main(String[] args){
Customer customer = new Customer();
customer.init("張思","女",89);
customer.display();
}
}
上面代碼可以寫成:
/**
* 構造函數演示
*/
class Customer {
String name;
String sex;
int age;
Customer(String name,String sex,int age){
this.name = name;
this.age = age;
this.sex = sex;
}
void display(){
System.out.println("name="+name);
System.out.println("age="+age);
System.out.println("sex="+sex);
}
}
public class ConstructorTest1{
public static void main(String[] args){
Customer c = new Customer("張三","男",13);
c.display();
}
}
注意:上面的this,避免了函數變量和成員變量的名字重複,不加會屏蔽成員函數中的變量。this表示該變量屬於類中的變量,而非成員變量(是局部變量)。此處可以理解爲對本對象的引用,“本對象自己”
如果不加:輸出如下:
可以看到初始值爲null,false,0。
構造函數,idea上顯示如下:
這句代碼:
Customer customer = new Customer("張思","女",89);實際上是調用了構造 函數。
擴展,靜態變量:
傳入color的實參,賦值情況如下如下,(static關鍵字,靜態變量存儲在區別於成員變量的區域,全局區)
內存存儲位置說明:
棧:成員變量,參數,對象引用(編譯器自動分配,程序結束回收內存)
堆:所有new出來的對象(程序員主動申請,需要主動釋放)
靜態區(全局區):存放static修飾的靜態變量(只需創建一次,下次可以直接引用),類裏面定義的 成員變量——共享
方法區+常量池:???待補充
本例中,定義了兩個類,Customer和ConstructorTest,編譯後會產生兩個 .class文件。當然也可以把兩個類放在不同文件中。
對於 Demo demo = new Demo(); 的內存分析見下鏈接
http://www.cnblogs.com/java-sky/p/7200085.html
四、注意
(1)、構造函數可以被重載。一個類可以定義多個構造函數。實例化對象時,根據具體情況,調用不同的構造函數。
(2)、若沒有定義構造函數,則系統默認定義一個空構造函數,無參。初始化對象直接new。
(3)、一個類創建,構造器自動調用,不同位置的參數代表不同屬性。在對象的生命週期中,構造函數只會調用一次。