如何從基礎(chǔ)到深入了解java構(gòu)造器-創(chuàng)新互聯(lián)

java中構(gòu)造方法是一個(gè)重要的概念,初學(xué)時(shí)有人會(huì)對(duì)此構(gòu)造方法的使用特別是其作用不清楚,下面我就來談?wù)勎覍?duì)java中構(gòu)造方法的理解,有不對(duì)或不清楚的地方希望各位看官提出意見,謝謝!

創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為定南等服務(wù)建站,定南等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為定南企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

一.構(gòu)造方法的定義聲明
構(gòu)造方法的名字必須和所在類的名字一致,沒有返回值,但不能聲明void,訪問權(quán)限可以為任意,但是一般情況下使用public方法權(quán)限,構(gòu)造方法中的參數(shù)可以根據(jù)需要自行定義,參數(shù)的不同的構(gòu)造方法構(gòu)成重載;

例:

class Fu
{
public Fu(){} //無(wú)參的公有構(gòu)造方法

public Fu(int i){} //參數(shù)類型為int的公有構(gòu)造方法

......

}
public class Demo extends Fu
{
public Demo(){} //無(wú)參的公有構(gòu)造方法

public Demo(int i){} //參數(shù)類型為int的公有構(gòu)造方法

public Demo(int i,double d){} //參數(shù)類型為int和double的公有構(gòu)造方法

...

}

二.構(gòu)造方法的使用
java中構(gòu)造方法的使用有兩個(gè)地方,一個(gè)是跟在關(guān)鍵字new后面,類名加上一個(gè)小括號(hào)(),小括號(hào)內(nèi)根據(jù)實(shí)際加上實(shí)參,另外一個(gè)是跟在關(guān)鍵字super或this后加上一個(gè)小括號(hào)(),小括號(hào)內(nèi)根據(jù)實(shí)際添加實(shí)參,下面進(jìn)行舉例。
例1:
Demo demo = new Demo(); //這里是調(diào)用的是一個(gè)無(wú)參的構(gòu)造方法,必須聲明在方法中,最好聲明在主方法
上面構(gòu)造方法的參數(shù)根據(jù)實(shí)際添加實(shí)參,jvm根據(jù)構(gòu)造方法的參數(shù)不同加載不同的構(gòu)造方法;
例2:
public Demo(){
this(2); //這里調(diào)用參數(shù)為int類型的本類的構(gòu)造方法
}
例3:
public Demo(){
super(1); //調(diào)用參數(shù)為int類型的父類的構(gòu)造方法
}
注意:例2和例3中this或super調(diào)用構(gòu)造方法只能出現(xiàn)在構(gòu)造方法中,而且必須出現(xiàn)在第一行,所以一個(gè)構(gòu)造方法中第一行只能為this或super調(diào)用構(gòu)造方法,兩者不能同時(shí)調(diào)用構(gòu)造方法出現(xiàn),而且注意this或super調(diào)用構(gòu)造方法時(shí),要留構(gòu)造方法出口,意思就是最后調(diào)用的構(gòu)造方法中沒有再調(diào)用別的構(gòu)造方法!
三.構(gòu)造方法的作用
1.為了初始化成員屬性,而不是初始化對(duì)象,初始化對(duì)象是通過new關(guān)鍵字實(shí)現(xiàn)的
2.通過new調(diào)用構(gòu)造方法初始化對(duì)象,編譯時(shí)根據(jù)參數(shù)簽名來檢查構(gòu)造函數(shù),稱為靜態(tài)聯(lián)編和編譯多態(tài)
(參數(shù)簽名:參數(shù)的類型,參數(shù)個(gè)數(shù)和參數(shù)順序)
3.創(chuàng)建子類對(duì)象會(huì)調(diào)用父類構(gòu)造方法但不會(huì)創(chuàng)建父類對(duì)象,只是調(diào)用父類構(gòu)造方法初始化父類成員屬性;
我總是要把構(gòu)造器和方法混淆,后來發(fā)現(xiàn),
方法,實(shí)際上,是需要用于執(zhí)行java代碼的,而構(gòu)造器,
構(gòu)造器,,,是一個(gè)類的實(shí)例!!
為什么呢?
類的實(shí)例,我們需要用類來創(chuàng)建對(duì)象,進(jìn)而訪問其屬性,因?yàn)閷?shí)例是需要被用來調(diào)用的,但是調(diào)用的話,我們不得不去考慮一個(gè)問題,就是對(duì)象,最終是被存儲(chǔ)在內(nèi)存里面的,而存儲(chǔ)的時(shí)候,我們的內(nèi)存不得不需要給他再另外開辟新的內(nèi)存空間,那么,java是如何給這種我們所需要的類來開辟內(nèi)存空間的呢?這就涉及到了java的內(nèi)存機(jī)制,就是說,我們必須要給這個(gè)類制作一個(gè)構(gòu)造器,而且這個(gè)構(gòu)造器的名稱必須和這個(gè)類的名稱是一致的,這樣,我們的java編譯器才能識(shí)別這個(gè)類,進(jìn)而給這個(gè)類在內(nèi)存中開辟內(nèi)存空間,也就是我們所說的,我們手動(dòng),人為的給他進(jìn)行“初始化”,事例如下:
class Rock {
Rock() {
System.out.print("Rock");
}
}
這樣,當(dāng)我們?cè)趯?duì)Rock類進(jìn)行調(diào)用的時(shí)候,我們的java編譯器就會(huì)事先對(duì)他進(jìn)行“自動(dòng)”地初始化,開辟內(nèi)存空間
那么現(xiàn)在問題又來了,舉個(gè)例子,我們的Rock()方法需要帶有一個(gè)參數(shù),形參,但是整個(gè)代碼中,需要不僅僅是帶有形參的Rock();還需要不帶形參的Rock(),在我們的構(gòu)造器對(duì)類進(jìn)行構(gòu)造的時(shí)候,需要將功能類似的,但形參不同的方法同時(shí)打包在該類下,以便在我們調(diào)用某個(gè)方法的時(shí)候,直接重載構(gòu)造器中的該方法,可以說,這種構(gòu)造形式,滿足了我們對(duì)功能類似,形參不同的方法,調(diào)用的時(shí)候,進(jìn)行重載,而滿足了編譯器自動(dòng)初始化,人不需要手動(dòng)初始化的需求。
而且有個(gè),問題,本來兩個(gè)方法,功能上是類似的,一棵樹和一株樹苗,你非得要給他們起不同的名字,多別扭,好在有了構(gòu)造器,能夠是功能相似的方法起相同的名字,不同的參數(shù),而能夠在被調(diào)用的時(shí)候得以重載,多么牛逼的構(gòu)造器 啊
我們說構(gòu)造器是一種方法,就象講澳大利亞的鴨嘴獸是一種哺育動(dòng)物。(按:老外喜歡打比喻,我也就照著翻譯)。要理解鴨嘴獸,那么先必須理解它和其他哺育動(dòng)物的區(qū)別。同樣地,要理解構(gòu)造器,那么就要了解構(gòu)造器和方法的區(qū)別。所有學(xué)習(xí)java的人,尤其是對(duì)那些要認(rèn)證考試的,理解構(gòu)造器是非常重要的。下面將簡(jiǎn)單介紹一下 ,最后用一個(gè)表作了些簡(jiǎn)單的總結(jié)。
功能和作用的不同
構(gòu)造器是為了創(chuàng)建一個(gè)類的實(shí)例。這個(gè)過程也可以在創(chuàng)建一個(gè)對(duì)象的時(shí)候用到:Platypus p1 = new Platypus();
相反,方法的作用是為了執(zhí)行java代碼。
修飾符,返回值和命名的不同
構(gòu)造器和方法在下面三個(gè)方便的區(qū)別:修飾符,返回值,命名。和方法一樣,構(gòu)造器可以有任何訪問的修飾: public, protected, private或者沒有修飾(通常被package 和 friendly調(diào)用). 不同于方法的是,構(gòu)造器不能有以下非訪問性質(zhì)的修飾: abstract, final, native, static, 或者 synchronized。
返回類型也是非常重要的。方法能返回任何類型的值或者無(wú)返回值(void),構(gòu)造器沒有返回值,也不需要void。
最后,談?wù)剝烧叩拿?。?gòu)造器使用和類相同的名字,而方法則不同。按照習(xí)慣,方法通常用小寫字母開始,而構(gòu)造器通常用大寫字母開始。構(gòu)造器通常是一個(gè)名詞,因?yàn)樗皖惷嗤欢椒ㄍǔ8咏鼊?dòng)詞,因?yàn)樗f明一個(gè)操作。
"this"的用法
構(gòu)造器和方法使用關(guān)鍵字this有很大的區(qū)別。方法引用this指向正在執(zhí)行方法的類的實(shí)例。靜態(tài)方法不能使用this關(guān)鍵字,因?yàn)殪o態(tài)方法不屬于類的實(shí)例,所以this也就沒有什么東西去指向。構(gòu)造器的this指向同一個(gè)類中,不同參數(shù)列表的另外一個(gè)構(gòu)造器,我們看看下面的代碼:
public class Platypus {

String name;

Platypus(String input) {
name = input;
}

Platypus() {
this("John/Mary Doe");
}

public static void main(String args[]) {
Platypus p1 = new Platypus("digger");
Platypus p2 = new Platypus();
}
}

在上面的代碼中,有2個(gè)不同參數(shù)列表的構(gòu)造器。第一個(gè)構(gòu)造器,給類的成員name賦值,第二個(gè)構(gòu)造器,調(diào)用第一個(gè)構(gòu)造器,給成員變量name一個(gè)初始值 "John/Mary Doe".
在構(gòu)造器中,如果要使用關(guān)鍵字this,那么,必須放在第一行,如果不這樣,將導(dǎo)致一個(gè)編譯錯(cuò)誤。
"super"的用法
構(gòu)造器和方法,都用關(guān)鍵字super指向超類,但是用的方法不一樣。方法用這個(gè)關(guān)鍵字去執(zhí)行被重載的超類中的方法??聪旅娴睦樱?br/>class Mammal {
void getBirthInfo() {
System.out.println("born alive.");
}
}

class Platypus extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
super.getBirthInfo();
}
}

在上面的例子中,使用super.getBirthInfo()去調(diào)用超類Mammal中被重載的方法。

構(gòu)造器使用super去調(diào)用超類中的構(gòu)造器。而且這行代碼必須放在第一行,否則編譯將出錯(cuò)??聪旅娴睦樱?/p>

public class SuperClassDemo {
SuperClassDemo() {}
}

class Child extends SuperClassDemo {
Child() {
super();
}
}

在上面這個(gè)沒有什么實(shí)際意義的例子中,構(gòu)造器 Child()包含了 super,它的作用就是將超類中的構(gòu)造器SuperClassDemo實(shí)例化,并加到 Child類中。
編譯器自動(dòng)加入代碼
編譯器自動(dòng)加入代碼到構(gòu)造器,對(duì)于這個(gè),java程序員新手可能比較混淆。當(dāng)我們寫一個(gè)沒有構(gòu)造器的類,編譯的時(shí)候,編譯器會(huì)自動(dòng)加上一個(gè)不帶參數(shù)的構(gòu)造器,例如:public class Example {}
編譯后將如下代碼:
public class Example {
Example() {}
}
在構(gòu)造器的第一行,沒有使用super,那么編譯器也會(huì)自動(dòng)加上,例如:
public class TestConstructors {
TestConstructors() {}
}

編譯器會(huì)加上代碼,如下:

public class TestConstructors {
TestConstructors() {
super;
}
}

仔細(xì)想一下,就知道下面的代碼

public class Example {}

經(jīng)過會(huì)被編譯器加代碼形如:

public class Example {
Example() {
super;
}
}

繼承
構(gòu)造器是不能被繼承的。子類可以繼承超類的任何方法??纯聪旅娴拇a:
public class Example {
public void sayHi {
system.out.println("Hi");
}

Example() {}
}

public class SubClass extends Example {
}

類 SubClass 自動(dòng)繼承了父類中的sayHi方法,但是,父類中的構(gòu)造器 Example()卻不能被繼承。
總結(jié)
主題 構(gòu)造器 方法
功能 建立一個(gè)類的實(shí)例 java功能語(yǔ)句
修飾 不能用bstract, final, native, static, or synchronized 能
返回類型 沒有返回值,沒有void 有返回值,或者void
命名 和類名相同;通常為名詞,大寫開頭 通常代表一個(gè)動(dòng)詞的意思,小寫開頭
this 指向同一個(gè)類中另外一個(gè)構(gòu)造器,在第一行 指向當(dāng)前類的一個(gè)實(shí)例,不能用于靜態(tài)方法
super 調(diào)用父類的構(gòu)造器,在第一行 調(diào)用父類中一個(gè)重載的方法
繼承 構(gòu)造器不能被繼承 方法可以被繼承
編譯器自動(dòng)加入一個(gè)缺省的構(gòu)造器 自動(dòng)加入(如果沒有) 不支持
編譯器自動(dòng)加入一個(gè)缺省的調(diào)用到超類的構(gòu)造器 自動(dòng)加入(如果沒有) 不支持

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前標(biāo)題:如何從基礎(chǔ)到深入了解java構(gòu)造器-創(chuàng)新互聯(lián)
URL地址:http://bm7419.com/article6/cdgsog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google微信小程序、網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站、網(wǎng)站收錄、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)