構造方法
-
我們已經對封裝有了基本的了解,接下來我們來看一個新的問題,依然以Person為例,由于Person中的屬性都被
private了,外界無法直接訪問屬性,必須對外提供相應的set和get方法,當創建人物件的時候,人物件一創建就要明確其姓名和年齡,那么該怎么做呢??
構造方法的介紹
-
在開發程序中經常要在創建物件的同時明確物件的屬性值,比如員工入職公司就要明確他的姓名、年齡等屬性資訊,
-
那么,創建物件就要明確屬性值,該怎么解決呢??也就是在創建物件的時候就要做的事情,當使用
new關鍵字創建物件時,怎么給物件的屬性初始化值呢??這就是要學習Java另外一個小技術——構造方法, -
什么是構造方法呢??從字面上理解為構建創造時用的方法,即就是物件創建時要執行的方法,既然是物件創建時要執行的方法,那么只要在new該物件時,知道其執行的構造方法是什么,就可以在執行這個方法的時候給物件進行屬性賦值,
-
構造方法的格式:
修飾符 構造方法名(引數串列)
{
}
-
構造方法的體現:
-
構造方法沒有回傳值型別,也不需要寫回傳值,因為它是為構建物件的,物件構建完,方法就執行結束,
-
構造方法名稱必須和類名保持一致,
-
構造方法沒有具體的回傳值,
-
-
構造方法的代碼:
class Person{
//Person的成員屬性age和name
private int age;
private String name;
?
//Person的構造方法,擁有引數串列
Person(int a,String nm){
//接受到創建物件時傳遞進來的值,將值賦給成員屬性
age = a;
name = nm;
}
}
構造方法呼叫和記憶體圖解
-
理解構造方法的格式和基本功能之后,現在就要研究構造方法是怎么執行的呢??在創建物件的時候是如何初始化的呢??
-
構造方法是專門用來創建物件的,也就是在new物件時要呼叫的方法,現在來看看如何呼叫構造方法,
class Person{
//Person的成員屬性age和name
private int age;
private String name;
?
//Person的構造方法,擁有引數串列
Person(int a,String nm){
//接受到創建物件時傳遞進來的值,將值賦給成員屬性
age = a;
name = nm;
}
public void speak(){
System.out.println("name"+name+"age"+age);
}
}
?
?
class PersonDemo{
public static void main(String[],args){
Person p2 = new Person(23,"張三");
p2.speak();
}
}上述代碼演示了創建物件時構造方法的呼叫,即在創建物件時,會呼叫與引數串列對應的構造方法,
上述代碼的圖解:

圖解說明:
-
首先將main方法壓入堆疊中,執行main方法中的new Person(23,"張三");
-
在堆記憶體中分配一片區域,用來存放創建的Person物件,這片記憶體區域會有屬于自己的記憶體地址(0x88),然后給成員變數進行默認初始化(name=null,age=0)
-
執行構造方法中的代碼(age=a,name=nm;),將變數a對應的23賦值給age,將變數nm對應的“張三”賦值給name,這段代碼執行結束后,成員變數age和name的值已經改變,執行結束之后的構造方法彈堆疊,Person物件創建完成,將Person物件記憶體地址0x88賦值給p2,
-
默認構造方法和細節
-
在沒有學習構造方法之前,我們也可以通過new關鍵字創建物件,并呼叫相應的方法,同時在描述事物時也沒有寫構造方法,這是為什么呢??
-
在之前的學習程序中,描述事物時,并沒有顯示指定的構造方法,當在編譯Java檔案時,編譯器會自動給class檔案中添加默認的構造方法,如果在描述類時,我們顯示指定了構造方法,那么,當在編譯Java源檔案時,編譯器就不會再給class檔案中添加默認構造方法,
class Person{
//如果沒有顯示指定的構造方法,編譯器會在編譯時自動添加默認的構造方法
Person(){}//空引數的默認構造方法
} -
當在描述事物時,要不要在類中寫構造方法呢?
-
這時要根據描述事物的特點來確定,當描述的事物在創建其物件時就要明確屬性的值,這時就需要在定義類的時候寫帶引數的構造方法,
-
如果創建物件時不需要明確具體資料,這時可以不用書寫構造方法(不書寫也有默認的構造方法)
-
-
構造方法的細節:
-
一個類中可以有多個構造方法,多個構造方法是以多載的形式存在(@Overload)
-
構造方法是可以被
private修飾符修飾的,作用:其他程式無法創建該類的物件,
class Person{
private int age;
private String name;
?
//私有無引數的構造方法,即外界不能通過new Person();陳述句創建本類物件
private Person(){
}
?
//多個構造方法是以多載的形式存在
Person(int a){
this.age = a;
}
?
Person(String nm,int a){
this.name = nm;
this.age = a;
}
} -
構造方法和一般方法的區別
-
到目前為止,學習兩種方法,分別是構造方法和一般方法,那么他們之間有什么異同呢?
-
構造方法是在物件創建時就執行了,而且只執行一次,
-
一般方法是在物件創建之后,需要使用時才被物件呼叫,并且可以多次呼叫,
-
-
問題:有了構造方法后可以堆物件的屬性進行初始化,那么還需要對應的set和get方法嗎?
-
需要相應的set和get方法,因為物件在創建之后需要修改和訪問相應的屬性值時,在這時只能通過set或者get方法來操作
-
思考:如下代碼有問題嗎?
class Person{
void Person(){
}
}
?
class PersonDemo{
public static void main(String[],args){
Person p = new Person();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430181.html
標籤:Java
上一篇:3分鐘整明白 快取熱點 是咋回事
