天天看小說

第99章

大B:“要學習Java,你必須理解構造器。因爲構造器可以提供許多特殊的方法,這個對於初學者經常混淆。但是,構造器和方法又有很多重要的區別。”

小A:“那它的功能和作用的有什麼不同?”

大B:“功能和作用的不同下面我就詳細給你講一下。構造器是爲了創建一個類的實例。這個過程也可以在創建一個對象的時候用到:Platypusp1=newPlatypus();相反,方法的作用是爲了執行java代碼。修飾符,返回值和命名的不同。”

小A:“構造器和方法在這裡有什麼區別?”

大B:“修飾符,返回值,命名。和方法一樣,構造器可以有任何訪問的修飾:public,protected,private或者沒有修飾(通常 被package和friendly調用)不同於方法的是,構造器不能有以下非訪問性質的修飾:abstract,final,native,static,或者synchronized。返回類型也是非常重要的。方法能返回任何類型的值或者無返回值(void),構造器沒有返回值,也不需要void。”

小A:“構造器和方法命名有什麼不同?”

大B:“構造器使用和類相同的名字,而方法則不同。按照習慣,方法通常用小寫字母開始,而構造器通常用大寫字母開始。構造器通常是一個名詞,因爲它和類名相同;而方法通常更接近動詞,因爲它說明一個操作。‘this’的用法,構造器和方法使用關鍵字this有很大的區別。方法引用this指向正在執行方法的類的實例。靜態方法不能使用this關鍵字,因爲靜態方法不屬於類的實例,所以this也就沒有什麼東西去指向。構造器的this指向同一個類中,不同參數列表的另外一個構造器。”

我們看看下面的代碼:

publicclassPlatypus{

Stringname;

Platypus(Stringinput){

name=input;

}

Platypus(){

this(“John/MaryDoe”);

}

publicstaticvoidmain(Stringargs[]){

Platypusp1=newPlatypus(“digger”);

Platypusp2=newPlatypus();

}

}

大B:“在剛纔講的代碼中,有2個不同參數列表的構造器。第一個構造器,給類的成員name賦值,第二個構造器,調用第一個構造器,給成員變量name一個初始值‘John/MaryDoe’。在構造器中,如果要使用關鍵字this,那麼,必須放在第一行,如果不這樣,將導致一個編譯錯誤。‘super’的用法,構造器和方法,都用關鍵字super指向超類,但是用的方法不一樣。方法用這個關鍵字去執行被重載的超類中的方法。”

看下面的例子:

classMammal{

voidgetBirthInfo(){

System.out.println(“bornalive.”);

}

}

classPlatypusextendsMammal{

voidgetBirthInfo(){

System.out.println(“hatchfromeggs”);

System.out.print(“amammalnormallyis”);

super.getBirthInfo();

}

}

大B:“從我們剛纔講的例子中,使用super.getBirthInfo()去調用超類Mammal中被重載的方法。構造器使用super去調用超類中的構造器。而且這行代碼必須放在第一行,否則編譯將出錯。”

看下面的例子:

publicclassSuperClassDemo{

SuperClassDemo(){}

}

classChildextendsSuperClassDemo{

Child(){

super();

}

}

大B:“在上面這個沒有什麼實際意義的例子中,構造器Child()包含了super,它的作用就是將超類中的構造器SuperClassDemo實例化,並加到Child類中。”

小A:“編譯器怎樣自動加入代碼?”

大B:“編譯器自動加入代碼到構造器,對於這個,java程序員新手可能比較混淆。當我們寫一個沒有構造器的類,編譯的時候,編譯器會自動加上一個不帶參數的構造器。”

例如:publicclassExample{}

編譯後將如下代碼:

publicclassExample{

Example(){}

}

在構造器的第一行,沒有使用super,那麼編譯器也會自動加上,例如:

publicclassTestConstructors{

TestConstructors(){}

}

編譯器會加上代碼,如下:

publicclassTestConstructors{

TestConstructors(){

super;

}

}

仔細想一下,就知道下面的代碼

publicclassExample{}

經過會被編譯器加代碼形如:

publicclassExample{

Example(){

super;

}

}

繼承

構造器是不能被繼承的。子類可以繼承超類的任何方法。看看下面的代碼:

publicclassExample{

publicvoidsayHi{

system.out.println(“Hi”);

}

Example(){}

}

publicclassSubClassextendsExample{

}

大B:“我們來注意一下java功能語句。修飾不能用abstract,final,native,static,orsynchronized能返回類型,沒有返回值,沒有void,有返回值,或者void,命名和類名相同;通常爲名詞,大寫開頭,通常代表一個動詞的意思,小寫開頭,this指向同一個類中另外一個構造器,在第一行指向當前類的一個實例,不能用於靜態方法,super調用父類的構造器,在第一行調用父類中一個重載的方法。繼承,構造器不能被繼承,方法可以被繼承,編譯器自動加入一個缺省的構造器,自動加入(如果沒有)不支持。 編譯器自動加入一個缺省的調用到超類的構造器,自動加入(如果沒有)不支持。”

第3章第171章第22章第203章第135章第161章第1章第92章第55章第184章第46章第154章第95章第3章第185章第216章第85章第83章第40章第166章第122章第218章第94章第78章第173章第12章第125章第205章第39章第118章第9章第151章第154章第223章第30章第123章第142章第83章第90章第179章第14章第56章第137章第119章第101章第15章第91章第82章第211章第72章第21章第24章第115章第146章第20章第27章第147章第48章第36章第151章第33章第75章第108章第79章第141章第36章第6章第16章第28章第9章第2章第173章第110章第37章第11章第219章第79章第183章第50章第142章第150章第156章第85章第18章第53章第44章第42章第46章第174章第57章第164章第119章第131章第145章第154章第150章第138章第99章第63章第162章
第3章第171章第22章第203章第135章第161章第1章第92章第55章第184章第46章第154章第95章第3章第185章第216章第85章第83章第40章第166章第122章第218章第94章第78章第173章第12章第125章第205章第39章第118章第9章第151章第154章第223章第30章第123章第142章第83章第90章第179章第14章第56章第137章第119章第101章第15章第91章第82章第211章第72章第21章第24章第115章第146章第20章第27章第147章第48章第36章第151章第33章第75章第108章第79章第141章第36章第6章第16章第28章第9章第2章第173章第110章第37章第11章第219章第79章第183章第50章第142章第150章第156章第85章第18章第53章第44章第42章第46章第174章第57章第164章第119章第131章第145章第154章第150章第138章第99章第63章第162章
主站蜘蛛池模板: 梅河口市| 商洛市| 达孜县| 安化县| 宝山区| 丽水市| 潜江市| 克拉玛依市| 于都县| 乳山市| 那曲县| 晋州市| 杨浦区| 巴里| 昌都县| 栾川县| 日照市| 化德县| 托克托县| 宜春市| 田东县| 公主岭市| 芜湖县| 北票市| 宣汉县| 肇庆市| 广汉市| 寻乌县| 通化市| 理塘县| 柳河县| 车致| 南丰县| 太仓市| 鹤山市| 全南县| 山西省| 龙江县| 镇坪县| 南昌县| 德令哈市|