【Java全棧進(jìn)階】-構(gòu)造方法

構(gòu)造方法

我們已經(jīng)對封裝有了基本的了解,接下來我們來看一個新的問題,依然以Person為例,由于Person中的屬性都被private了,外界無法直接訪問屬性,必須對外提供相應(yīng)的set和get方法。當(dāng)創(chuàng)建人對象的時候,人對象一創(chuàng)建就要明確其姓名和年齡,那么該怎么做呢??

構(gòu)造方法的介紹

在開發(fā)過程中經(jīng)常要在創(chuàng)建對象的同時明確對象的屬性值,比如員工入職公司就要明確他的姓名、年齡等屬性信息。

那么,創(chuàng)建對象就要明確屬性值,該怎么解決呢??也就是在創(chuàng)建對象的時候就要做的事情,當(dāng)使用new關(guān)鍵字創(chuàng)建對象時,怎么給對象的屬性初始化值呢??這就是要學(xué)習(xí)Java另外一個小技術(shù)——構(gòu)造方法。

什么是構(gòu)造方法呢??從字面上理解為構(gòu)建創(chuàng)造時用的方法,即就是對象創(chuàng)建時要執(zhí)行的方法。既然是對象創(chuàng)建時要執(zhí)行的方法,那么只要在new該對象時,知道其執(zhí)行的構(gòu)造方法是什么,就可以在執(zhí)行這個方法的時候給對象進(jìn)行屬性賦值。


構(gòu)造方法的格式:

修飾符 構(gòu)造方法名(參數(shù)列表)

{

}

構(gòu)造方法的體現(xiàn):

構(gòu)造方法沒有返回值類型,也不需要寫返回值。因為它是為構(gòu)建對象的,對象構(gòu)建完,方法就執(zhí)行結(jié)束。

構(gòu)造方法名稱必須和類名保持一致。

構(gòu)造方法沒有具體的返回值。

構(gòu)造方法的代碼:

classPerson{

//Person的成員屬性age和name

privateintage;

privateStringname;

//Person的構(gòu)造方法,擁有參數(shù)列表

Person(inta,Stringnm){

//接受到創(chuàng)建對象時傳遞進(jìn)來的值,將值賦給成員屬性

age=a;

name=nm;

}

}

構(gòu)造方法調(diào)用和內(nèi)存圖解

理解構(gòu)造方法的格式和基本功能之后,現(xiàn)在就要研究構(gòu)造方法是怎么執(zhí)行的呢??在創(chuàng)建對象的時候是如何初始化的呢??

構(gòu)造方法是專門用來創(chuàng)建對象的,也就是在new對象時要調(diào)用的方法,現(xiàn)在來看看如何調(diào)用構(gòu)造方法。

classPerson{

//Person的成員屬性age和name

privateintage;

privateStringname;

//Person的構(gòu)造方法,擁有參數(shù)列表

Person(inta,Stringnm){

//接受到創(chuàng)建對象時傳遞進(jìn)來的值,將值賦給成員屬性

age=a;

name=nm;

}

publicvoidspeak(){

System.out.println("name"+name+"age"+age);

}

}

classPersonDemo{

publicstaticvoidmain(String[],args){

Personp2=newPerson(23,"張三");

p2.speak();

}

}

上述代碼演示了創(chuàng)建對象時構(gòu)造方法的調(diào)用,即在創(chuàng)建對象時,會調(diào)用與參數(shù)列表對應(yīng)的構(gòu)造方法。

上述代碼的圖解:

圖解說明:

首先將main方法壓入棧中,執(zhí)行main方法中的new Person(23,"張三");

在堆內(nèi)存中分配一片區(qū)域,用來存放創(chuàng)建的Person對象,這片內(nèi)存區(qū)域會有屬于自己的內(nèi)存地址(0x88),然后給成員變量進(jìn)行默認(rèn)初始化(name=null,age=0)

執(zhí)行構(gòu)造方法中的代碼(age=a,name=nm;),將變量a對應(yīng)的23賦值給age,將變量nm對應(yīng)的“張三”賦值給name,這段代碼執(zhí)行結(jié)束后,成員變量age和name的值已經(jīng)改變。執(zhí)行結(jié)束之后的構(gòu)造方法彈棧,Person對象創(chuàng)建完成,將Person對象內(nèi)存地址0x88賦值給p2。

默認(rèn)構(gòu)造方法和細(xì)節(jié)

在沒有學(xué)習(xí)構(gòu)造方法之前,我們也可以通過new關(guān)鍵字創(chuàng)建對象,并調(diào)用相應(yīng)的方法,同時在描述事物時也沒有寫構(gòu)造方法,這是為什么呢??

在之前的學(xué)習(xí)過程中,描述事物時,并沒有顯示指定的構(gòu)造方法,當(dāng)在編譯Java文件時,編譯器會自動給class文件中添加默認(rèn)的構(gòu)造方法。如果在描述類時,我們顯示指定了構(gòu)造方法,那么,當(dāng)在編譯Java源文件時,編譯器就不會再給class文件中添加默認(rèn)構(gòu)造方法。

classPerson{

//如果沒有顯示指定的構(gòu)造方法,編譯器會在編譯時自動添加默認(rèn)的構(gòu)造方法

Person(){}//空參數(shù)的默認(rèn)構(gòu)造方法

}

當(dāng)在描述事物時,要不要在類中寫構(gòu)造方法呢?

這時要根據(jù)描述事物的特點來確定,當(dāng)描述的事物在創(chuàng)建其對象時就要明確屬性的值,這時就需要在定義類的時候?qū)?b>帶參數(shù)的構(gòu)造方法。

如果創(chuàng)建對象時不需要明確具體數(shù)據(jù),這時可以不用書寫構(gòu)造方法(不書寫也有默認(rèn)的構(gòu)造方法)

構(gòu)造方法的細(xì)節(jié):

一個類中可以有多個構(gòu)造方法,多個構(gòu)造方法是以重載的形式存在(@Overload)

構(gòu)造方法是可以被private修飾符修飾的,作用:其他程序無法創(chuàng)建該類的對象。

classPerson{

privateintage;

privateStringname;

//私有無參數(shù)的構(gòu)造方法,即外界不能通過new Person();語句創(chuàng)建本類對象

privatePerson(){

}

//多個構(gòu)造方法是以重載的形式存在

Person(inta){

this.age=a;

}

Person(Stringnm,inta){

this.name=nm;

this.age=a;

}

}

構(gòu)造方法和一般方法的區(qū)別

到目前為止,學(xué)習(xí)兩種方法,分別是構(gòu)造方法一般方法,那么他們之間有什么異同呢?

構(gòu)造方法是在對象創(chuàng)建時就執(zhí)行了,而且只執(zhí)行一次。

一般方法是在對象創(chuàng)建之后,需要使用時才被對象調(diào)用,并且可以多次調(diào)用。


問題:有了構(gòu)造方法后可以堆對象的屬性進(jìn)行初始化,那么還需要對應(yīng)的set和get方法嗎?

需要相應(yīng)的set和get方法,因為對象在創(chuàng)建之后需要修改和訪問相應(yīng)的屬性值時,在這時只能通過set或者get方法來操作

思考:如下代碼有問題嗎?

classPerson{

voidPerson(){

}

}

classPersonDemo{

publicstaticvoidmain(String[],args){

Personp=newPerson();

}

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容