




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-.z.CreatedbyAIwenon2017/5/14.
java是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言;類(lèi)可被認(rèn)為是一種自定義的數(shù)據(jù)類(lèi)型,可以使用類(lèi)來(lái)定義變量,所有使用類(lèi)定義的變量都是引用變量,它們將會(huì)引用到類(lèi)的對(duì)象。類(lèi)用于描述客觀世界里*一類(lèi)對(duì)象的共同特征,而對(duì)象則是類(lèi)的具體存在,java程序使用類(lèi)的構(gòu)造器來(lái)創(chuàng)建該類(lèi)的對(duì)象。java也支持面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、和多態(tài)。java提供了private、protected、和public三個(gè)訪(fǎng)問(wèn)控制修飾符來(lái)實(shí)現(xiàn)良好的封裝,提供了e*tends關(guān)鍵字讓子類(lèi)繼承父類(lèi),子類(lèi)繼承父類(lèi)就可以繼承到父類(lèi)的成員變量和和方法,如果訪(fǎng)問(wèn)控制允許,子類(lèi)實(shí)例可以直接調(diào)用父類(lèi)里定義的方法。繼承是實(shí)現(xiàn)類(lèi)復(fù)用的重要手段。使用繼承關(guān)系來(lái)實(shí)現(xiàn)復(fù)用時(shí),子類(lèi)對(duì)象可以直接賦給父類(lèi)變量,這個(gè)變量具有多態(tài)性。面向?qū)ο蟮某绦蛟O(shè)計(jì)過(guò)程中有兩個(gè)重要的概念:類(lèi)(Class)和對(duì)象(object,也被稱(chēng)為實(shí)例,instance)。類(lèi)可以包含三種最常見(jiàn)的成員:構(gòu)造器、成員變量、和方法。構(gòu)造器用于構(gòu)造該類(lèi)的實(shí)例,java語(yǔ)言通過(guò)new關(guān)鍵字類(lèi)調(diào)用構(gòu)造器,從而返回該類(lèi)的實(shí)例。構(gòu)造器是一個(gè)類(lèi)創(chuàng)建對(duì)象的根本途徑,如果一個(gè)類(lèi)沒(méi)有構(gòu)造器,這個(gè)類(lèi)通常無(wú)法創(chuàng)建實(shí)例。因此java語(yǔ)言提供了一個(gè)功能:如果程序員沒(méi)有為一個(gè)類(lèi)編寫(xiě)構(gòu)造器,則系統(tǒng)會(huì)為該類(lèi)提供一個(gè)默認(rèn)的構(gòu)造器,這個(gè)構(gòu)造器總是沒(méi)有參數(shù)的。一旦程序員為一個(gè)類(lèi)提供了構(gòu)造器,系統(tǒng)將不再為該類(lèi)提供構(gòu)造器。構(gòu)造器用于對(duì)類(lèi)實(shí)例進(jìn)行初始化操作,構(gòu)造器支持重載,如果多個(gè)重載的構(gòu)造器里包含了相同的初始化代碼,則可以把這些初始化代碼放置在普通初始化塊里完成,初始化塊總在構(gòu)造器執(zhí)行之前被調(diào)用。靜態(tài)初始化塊代碼用于初始化類(lèi),在類(lèi)初始化階段被執(zhí)行。如果繼承樹(shù)里*一個(gè)類(lèi)需要被初始化時(shí),系統(tǒng)將會(huì)同時(shí)初始化該類(lèi)的所有父類(lèi)。構(gòu)造器修飾符:可以是public、protected、private其中之一,或者省略構(gòu)造器名:構(gòu)造器名必須和類(lèi)名相同。注意:構(gòu)造器既不能定義返回值類(lèi)型,也不能使用void聲明構(gòu)造器沒(méi)有返回值。如果為構(gòu)造器定義了返回值類(lèi)型,或使用void聲明構(gòu)造器沒(méi)有返回值,編譯時(shí)不會(huì)出錯(cuò),但java會(huì)把這個(gè)所謂的構(gòu)造器當(dāng)成方法來(lái)處理——它就不再是構(gòu)造器。實(shí)際上類(lèi)的構(gòu)造器是有返回值的,當(dāng)使用new關(guān)鍵字來(lái)調(diào)用構(gòu)造器時(shí),構(gòu)造器返回該類(lèi)的實(shí)例,可以把這個(gè)類(lèi)的實(shí)例當(dāng)成構(gòu)造器的返回值。因此構(gòu)造器的返回值類(lèi)型總是當(dāng)前類(lèi),無(wú)須定義返回值類(lèi)型。不要在構(gòu)造器里顯式的使用return來(lái)返回當(dāng)前類(lèi)的對(duì)象,因?yàn)闃?gòu)造器的返回值是隱式的。java類(lèi)名必須是由一個(gè)或多個(gè)有意義的單詞連綴而成的,每個(gè)單詞首字母大寫(xiě),其他字母全部小寫(xiě),單詞與單詞之間不要使用任何分隔符。成員變量:成員變量的修飾符:public、protected、private、static、final前三個(gè)只能出現(xiàn)一個(gè)再和后面的修飾符組合起來(lái)修飾成員變量,也可省略。成員變量:由一個(gè)或者多個(gè)有意義的單詞連綴而成,第一個(gè)單詞首字母小寫(xiě),后面每個(gè)單詞首字母大寫(xiě),其他字母全部小寫(xiě),單詞與單詞之間不要使用任何分隔符。類(lèi)型:可以是java語(yǔ)言允許的任何數(shù)據(jù)類(lèi)型,包括基本類(lèi)型和引用類(lèi)型。成員方法:方法修飾符:public、protected、private、static、final、abstract,前三個(gè)只能出現(xiàn)一個(gè),static和final最多只能出現(xiàn)其中的一個(gè),和abstract組合起來(lái)使用。也可省略。返回值類(lèi)型:可以是java語(yǔ)言的允許的任何數(shù)據(jù)類(lèi)型,包括基本類(lèi)型和引用類(lèi)型。方法名:和成員變量的方法命名規(guī)則相同,通常建議方法名以英文動(dòng)詞開(kāi)頭。方法體里多條可執(zhí)行語(yǔ)句之間有嚴(yán)格的執(zhí)行順序,排在方法體前面的語(yǔ)句總先執(zhí)行,排在方法體后面的語(yǔ)句總是后執(zhí)行。static是一個(gè)特殊的關(guān)鍵字,它可用于修飾方法、成員變量等成員。static修飾的成員表明它屬于這個(gè)類(lèi)本身,而不屬于該類(lèi)的單個(gè)實(shí)例,因此通過(guò)把static修飾的成員變量和方法被稱(chēng)為類(lèi)變量、類(lèi)方法(靜態(tài)成員變量,靜態(tài)成員方法);不使用static修飾的成員變量和方法稱(chēng)為實(shí)例變量和實(shí)例方法(非靜態(tài)成員變量,非靜態(tài)成員方法)。靜態(tài)成員不能直接訪(fǎng)問(wèn)非靜態(tài)成員。static的真正作用就是用于區(qū)分成員變量、方法、內(nèi)部類(lèi)、初始化塊,這四種成員到底屬于類(lèi)本身還是屬于實(shí)例。有static修飾的成員屬于類(lèi)本身,沒(méi)有類(lèi)修飾的成員屬于該類(lèi)的實(shí)例。java類(lèi)大致有如下作用:定義變量創(chuàng)建對(duì)象調(diào)用類(lèi)的類(lèi)方法或訪(fǎng)問(wèn)類(lèi)的類(lèi)變量。定義一個(gè)類(lèi)就是為了重復(fù)創(chuàng)建該類(lèi)的實(shí)例,同一個(gè)類(lèi)的多個(gè)實(shí)例具有相同的特征,而類(lèi)則是定義了多個(gè)實(shí)例的共同特征。類(lèi)里定義的方法和成員變量都可以通過(guò)類(lèi)或?qū)嵗齺?lái)調(diào)用。Static修飾的方法和成員變量,既可通過(guò)類(lèi)來(lái)調(diào)用,也可通過(guò)實(shí)例來(lái)調(diào)用;沒(méi)有使用static修飾的普通方法成員變量,只可通過(guò)實(shí)例來(lái)調(diào)用。Personp=newPerson();這行代碼創(chuàng)建了一個(gè)Person實(shí)例,也被稱(chēng)為Person對(duì)象,這個(gè)Person對(duì)象被賦給p變量。在這行代碼中實(shí)際上產(chǎn)生了兩個(gè)東西,一個(gè)是p變量,一個(gè)是Person對(duì)象。P引用變量本身只存儲(chǔ)了一個(gè)地址值,并未包含任何實(shí)際數(shù)據(jù),但它指向?qū)嶋H的Person對(duì)象。Person對(duì)象由多塊內(nèi)存組成,不同內(nèi)存塊分別存儲(chǔ)了Person對(duì)象的不同成員變量。類(lèi)是一種引用數(shù)據(jù)類(lèi)型,因此程序中定義的Person類(lèi)型的變量實(shí)際上是一個(gè)引用,它被存放在棧內(nèi)存里,指向?qū)嶋H的Person對(duì)象;而真正的Person對(duì)象則存放在堆內(nèi)存中。當(dāng)一個(gè)對(duì)象被創(chuàng)建成功以后,這個(gè)對(duì)象將保存在堆內(nèi)存中,java程序不允許直接訪(fǎng)問(wèn)堆內(nèi)存中的對(duì)象,只能通過(guò)該對(duì)象的引用操作該對(duì)象。堆內(nèi)存里的對(duì)象可以有多個(gè)引用,即多個(gè)引用變量指向同一個(gè)對(duì)象。如果堆內(nèi)存里的對(duì)象沒(méi)有任何變量指向該對(duì)象,則程序?qū)o(wú)法再訪(fǎng)問(wèn)該對(duì)象,這個(gè)對(duì)象也就變成了垃圾,java垃圾回收機(jī)制將回收該對(duì)象,釋放該對(duì)象所占的內(nèi)存區(qū)。對(duì)象的this引用Java提供了一個(gè)this關(guān)鍵字,this關(guān)鍵字總是指向調(diào)用該方法的對(duì)象。This作為對(duì)象的默認(rèn)引用有兩種情形:構(gòu)造器中引用該構(gòu)造器正在初始化的對(duì)象;在方法中引用調(diào)用該方法的對(duì)象。This關(guān)鍵字最大的作用就是讓類(lèi)中一個(gè)方法,訪(fǎng)問(wèn)該類(lèi)里的另一個(gè)方法或者實(shí)例變量。Java允許對(duì)象的一個(gè)成員直接調(diào)用另一個(gè)成員,可以省略this 前綴。如果在static修飾的方法中使用this關(guān)鍵字,則這個(gè)關(guān)鍵字就無(wú)法指向合適的對(duì)象,所以,static修飾的方法中不能使用this引用。Java編程時(shí)不要使用對(duì)象去調(diào)用static修飾的成員變量、方法、而是應(yīng)該使用類(lèi)去調(diào)用static修飾的成員變量、方法。如果確實(shí)需要在靜態(tài)方法中訪(fǎng)問(wèn)另一個(gè)普通方法,則只能重新創(chuàng)建一個(gè)對(duì)象。大部分的時(shí)候,普通方法訪(fǎng)問(wèn)其他方法、成員變量時(shí)無(wú)須使用this前綴,但如果方法里有個(gè)局部變量和成員變量同名,但程序又需要在該方法里訪(fǎng)問(wèn)這個(gè)被覆蓋的成員變量,則必須使用this前綴。This引用也可以用于構(gòu)造器中作為默認(rèn)引用,由于構(gòu)造器時(shí)直接使用new關(guān)鍵字來(lái)調(diào)用,而不是使用對(duì)象來(lái)調(diào)用的,所以this在構(gòu)造器中代表該構(gòu)造器正在初始化對(duì)象。方法:Java里的方法不能獨(dú)立存在,所有的方法都必須定義在類(lèi)里。如果這個(gè)方法是用來(lái)static修飾,則這個(gè)方法屬于這個(gè)類(lèi),否則這個(gè)方法屬于這個(gè)類(lèi)的實(shí)例。執(zhí)行方法時(shí),必須使用類(lèi)或者對(duì)象作為調(diào)用者。同一個(gè)類(lèi)的一個(gè)方法調(diào)用另外一個(gè)方法時(shí),如果被調(diào)方法是普通方法,則默認(rèn)使用this作為調(diào)用者;如果被調(diào)用方法是靜態(tài)方法,則默認(rèn)使用類(lèi)作為調(diào)用者。也就是說(shuō)java中看起來(lái)*些方法可以被獨(dú)立執(zhí)行,但實(shí)際上還是使用this或者類(lèi)來(lái)作為調(diào)用者。Java里方法參數(shù)傳遞方式只有一種:值傳遞。所謂值傳遞,就是講實(shí)際參數(shù)值的副本(復(fù)制品)傳入方法內(nèi),而參數(shù)本身不會(huì)受到任何影響。從JDK1.5之后,java允許定義形參個(gè)數(shù)可變的參數(shù),從而允許為方法指定數(shù)量不確定的形參。如果在定義方法時(shí),在最后一個(gè)形參的類(lèi)型后增加三點(diǎn)(…),則表明該形參可以接受多個(gè)參數(shù)值,多個(gè)參數(shù)值被當(dāng)成數(shù)組傳入。publicclassVarargs{
//定義形參可變的方法
publicstaticvoidtest(inta,String...books){
//books被當(dāng)成數(shù)組處理
for(Stringtmp:books){
System.out.println(tmp);
}
System.out.println(a);
}
publicstaticvoidmain(String[]args){
//調(diào)用test方法
test(5,"hello","world","aa");
}
}數(shù)組形式的形參可以處于形參列表的任意位置,但個(gè)數(shù)可變的形參只能處于形參表的最后。也就是說(shuō)最多只能有一個(gè)長(zhǎng)度可變的形參。形參可變和傳入數(shù)組的區(qū)別:publicstaticvoidtest(inta,String...books);
publicstaticvoidtest(inta,String[]books);
test(5,"aa","bb","cc");
test(5,newString[]{"aa","bb","cc"});方法重載:Java允許同一個(gè)類(lèi)里定義多個(gè)同名方法,只要形參列表不同就行。如果同一個(gè)類(lèi)中包含了兩個(gè)或兩個(gè)以上方法的方法名相同,但形參列表不同,則被稱(chēng)為方法的重載。Java程序確定一個(gè)方法需要三個(gè)要素:調(diào)用者;方法名;形參列表。方法的重載要求就是兩同一不同:同一個(gè)類(lèi)中方法名相同,參數(shù)列表不同。至于方法的其他部分,如方法返回值類(lèi)型、修飾符等,與方法重載沒(méi)有任何關(guān)系。publicclassOverloadVarargs{
publicvoidtest(Stringmsg){
System.out.println("只有一個(gè)參數(shù)的test");
}
//因?yàn)榍懊嬉呀?jīng)有了一個(gè)字符串參數(shù)的方法,則長(zhǎng)度可變形參里不包含一個(gè)字符串參數(shù)的形式
publicvoidtest(String...books){
System.out.println("形參可變的test方法");
}
publicstaticvoidmain(String[]args){
OverloadVarargsolv=newOverloadVarargs();
//下面兩次調(diào)用將執(zhí)行第二個(gè)test方法
olv.test();
olv.test("aa","bb");
//將調(diào)用第一個(gè)test方法
olv.test("aa");
//將調(diào)用第二個(gè)test方法
olv.test(newString[]{"aa"});
}
}Java中變量分為:成員變量和局部變量。成員變量被分為類(lèi)變量和實(shí)例變量?jī)煞N,定義成員變量時(shí)沒(méi)有static修飾的就是實(shí)例變量,有static修飾的就是類(lèi)變量。變量的命名:從程序的可讀性角度來(lái)看,應(yīng)該是多個(gè)有意義的單詞連綴而成,其中第一個(gè)單詞首字母小寫(xiě),后面每個(gè)單詞首字母大寫(xiě)。如果通過(guò)一個(gè)實(shí)例修改了類(lèi)變量的值,由于這個(gè)類(lèi)變量并不屬于它,而是屬于它對(duì)應(yīng)的類(lèi)。因此,修改的依然是類(lèi)變量,與通過(guò)該類(lèi)來(lái)修改類(lèi)變量的結(jié)果完全相同,這會(huì)導(dǎo)致該類(lèi)的其他實(shí)例來(lái)訪(fǎng)問(wèn)這個(gè)類(lèi)變量時(shí)也將獲得這個(gè)被修改過(guò)的值。成員變量無(wú)須顯式初始化,只要為一個(gè)類(lèi)定義了類(lèi)變量或?qū)嵗兞浚到y(tǒng)就會(huì)在這個(gè)類(lèi)的初始化階段或創(chuàng)建該類(lèi)的實(shí)例時(shí),進(jìn)行默認(rèn)初始化。實(shí)例變量隨實(shí)例的存在而存在,而類(lèi)變量則隨類(lèi)的存在而存在。實(shí)例也可訪(fǎng)問(wèn)類(lèi)變量,同一個(gè)類(lèi)的所有實(shí)例訪(fǎng)問(wèn)類(lèi)變量時(shí),實(shí)際上訪(fǎng)問(wèn)的是該類(lèi)本身的同一個(gè)變量,也就是說(shuō),訪(fǎng)問(wèn)了同一片內(nèi)存區(qū)。局部變量根據(jù)定義形式的不同,又可分為三種形式:形參,方法局部變量,代碼塊局部變量;局部變量除了形參之外,都必須顯示初始化。在同一個(gè)類(lèi)里,成員變量的作用范圍是整個(gè)類(lèi)內(nèi)有效,一個(gè)類(lèi)里不能定義兩個(gè)同名的成員變量,即使一個(gè)是類(lèi)變量,一個(gè)是實(shí)例變量也不行;一個(gè)方法里不能定義兩個(gè)同名的方法局部變量,方法局部變量與形參也不能同名;同一個(gè)方法中不同代碼塊內(nèi)局部變量可以同名;如果先定義代碼塊局部變量,后定義方法局部變量,前面定義的代碼塊局部變量與后面定義的方法局部變量也可同名.Java允許局部變量和成員變量同名,如果方法里的局部變量和成員變量同名,局部變量會(huì)覆蓋成員變量,如果需要在這個(gè)方法里引用被覆蓋的成員變量,則可使用this(對(duì)于實(shí)例變量)或類(lèi)名(對(duì)于類(lèi)變量)作為調(diào)用者來(lái)限定訪(fǎng)問(wèn)成員變量。publicclassVariableOverrideTest{
//定義一個(gè)name實(shí)例變量
privateStringname="李剛";
//定義一個(gè)price類(lèi)變量
privatestaticdoubleprice=78.0;
publicstaticvoidmain(String[]args){
//方法里局部變量覆蓋成員變量,將輸出price的局部變量65
intprice=65;
System.out.println(price);
//使用類(lèi)名作為price變量的限定,將輸出price類(lèi)變量的值
System.out.println(VariableOverrideTest.price);
newVariableOverrideTest().info();
}
publicvoidinfo(){
//方法里的局部變量,局部變量覆蓋成員變量,輸出name局部變量的值:孫悟空
Stringname="孫悟空";
System.out.println(name);
//將輸出name實(shí)例的值:李剛
System.out.println();
}
}當(dāng)系統(tǒng)加載類(lèi)或創(chuàng)建該類(lèi)的實(shí)例時(shí),系統(tǒng)自動(dòng)為成員變量分配內(nèi)存空間,并在分配內(nèi)存空間后,自動(dòng)為成員變量指定初始值。Personp1=newPerson();時(shí),如果這行代碼是第一次使用Person類(lèi),則系統(tǒng)通常會(huì)在第一次使用Person類(lèi)時(shí)加載這個(gè)類(lèi),并初始化這個(gè)類(lèi)。局部變量定以后,必須經(jīng)過(guò)顯式初始化后才能使用,系統(tǒng)不會(huì)為局部變量執(zhí)行初始化。局部變量不屬于任何類(lèi)或者實(shí)例,因此它總是保存在其所在方法的棧內(nèi)存中。如果局部變量時(shí)基本類(lèi)型的變量,則直接把這個(gè)變量的值保存在該變量對(duì)應(yīng)的內(nèi)存中;如果局部變量是一個(gè)引用類(lèi)型的變量,則這個(gè)變量里存放的是地址,通過(guò)該地址引用到該變量實(shí)際引用的對(duì)象或者數(shù)組。棧內(nèi)存中的變量無(wú)須系統(tǒng)垃圾回收,往往隨是方法或代碼塊的運(yùn)行結(jié)束而結(jié)束。如果定義的*個(gè)變量是用于描述*個(gè)類(lèi)或*個(gè)對(duì)象的固有信息的,這種變量應(yīng)該定義成成員變量。如果這種信息對(duì)這個(gè)類(lèi)的所有實(shí)例完全相同,或者說(shuō)它是類(lèi)相關(guān)的,則該定義成類(lèi)變量;如果這個(gè)信息是實(shí)例相關(guān)的,則應(yīng)該定義成實(shí)例變量。用于保存*個(gè)類(lèi)或*個(gè)實(shí)例狀態(tài)信息的變量通常應(yīng)該使用成員變量。如果*個(gè)信息需要在*個(gè)類(lèi)的多個(gè)方法之間進(jìn)行共享,則這個(gè)信息應(yīng)該使用成員變量來(lái)保存。隱藏和封裝訪(fǎng)問(wèn)控制符用于控制一個(gè)類(lèi)的成員是否可以被其他類(lèi)訪(fǎng)問(wèn)。Java提供了3個(gè)訪(fǎng)問(wèn)控制修飾符:private,protected,和public,還有一個(gè)默認(rèn)訪(fǎng)問(wèn)控制修飾符defaultPrivate(當(dāng)前類(lèi)訪(fǎng)問(wèn)權(quán)限);default(包訪(fǎng)問(wèn)權(quán)限);protected(子類(lèi)訪(fǎng)問(wèn)權(quán)限):如果一個(gè)成員使用protected訪(fǎng)問(wèn)修飾符修飾,則這個(gè)成員既可以被同一個(gè)包中的其他類(lèi)訪(fǎng)問(wèn),也可以被不同包中子類(lèi)訪(fǎng)問(wèn)。通常情況下,使用protected修飾的方法,通常希望其子類(lèi)來(lái)重寫(xiě)這個(gè)方法。Public(公共訪(fǎng)問(wèn)權(quán)限)對(duì)于局部變量而言,其作用域就是它所在的方法,不可能被其他類(lèi)訪(fǎng)問(wèn),因此不能使用訪(fǎng)問(wèn)控制符來(lái)修飾。外部類(lèi)只能有兩種訪(fǎng)問(wèn)控制級(jí)別:public和默認(rèn),不能使用private和protectedpublicclassPerson{
privateStringname;
privateintage;
publicvoidsetName(Stringname){
if(name.length()>6||name.length()<2){
System.out.println("error");
return;
}
else{
=name;
}
}
publicStringgetName(){
;
}
publicvoidsetAge(intage){
if(age>100||age<0){
System.out.println("error");
}else{
this.age=age;
}
}
publicintgetAge(){
returnthis.age;
}
}publicclassPersonTest{
publicstaticvoidmain(String[]args){
Personp=newPerson();
//下面的變量不會(huì)運(yùn)行錯(cuò)誤,但是會(huì)提示錯(cuò)誤
p.setAge(1000);
//因?yàn)樯厦鏇](méi)有成功設(shè)置p的age成員,故輸出0
System.out.println(p.getAge());
//成功設(shè)置p的age成員
p.setAge(30);
System.out.println(p.getAge());
//成功設(shè)置p的name成員
p.setName("李剛");
System.out.println(p.getName());
}
}構(gòu)造器:構(gòu)造器最大的用途是創(chuàng)建對(duì)象時(shí)執(zhí)行初始化。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)為這個(gè)對(duì)象的實(shí)例變量進(jìn)行默認(rèn)初始化,這種默認(rèn)的初始化把所有基本類(lèi)型的實(shí)例變量設(shè)為0(對(duì)數(shù)值型實(shí)例變量)或false(對(duì)布爾型實(shí)例變量),把所有引用類(lèi)型的實(shí)例變量設(shè)為null。如果想改變這種默認(rèn)的初始化,想讓系統(tǒng)創(chuàng)建對(duì)象時(shí)就位該對(duì)象的實(shí)例變量顯式指定初始值,就可以通過(guò)構(gòu)造器來(lái)實(shí)現(xiàn)。因?yàn)闃?gòu)造器主要用于被其他方法調(diào)用,用以返回該類(lèi)的實(shí)例,因而通常把構(gòu)造器設(shè)置成public訪(fǎng)問(wèn)權(quán)限,從而允許系統(tǒng)中任何位置的類(lèi)來(lái)創(chuàng)建該類(lèi)的對(duì)象。如果設(shè)置成protected,主要用于被子類(lèi)調(diào)用;設(shè)置為private,阻止其他類(lèi)創(chuàng)建該類(lèi)的實(shí)例。如果系統(tǒng)中包含了多個(gè)構(gòu)造器,其中一個(gè)構(gòu)造器B的執(zhí)行體里完全包含另一個(gè)構(gòu)造器A的執(zhí)行體。為了這構(gòu)造器B中調(diào)用構(gòu)造器A中的初始化代碼,又不會(huì)重新創(chuàng)建一個(gè)java對(duì)象,可以使用this關(guān)鍵字來(lái)調(diào)用相應(yīng)的構(gòu)造器。publicclassApple{
publicStringname;
publicStringcolor;
publicdoubleweight;
//兩個(gè)參數(shù)的構(gòu)造器
publicApple(Stringname,Stringcolor){
=name;
this.color=color;
}
//三個(gè)參數(shù)的構(gòu)造器
publicApple(Stringname,Stringcolor,doubleweight){
//通過(guò)this調(diào)用另一個(gè)重載的構(gòu)造器的初始化代碼
this(name,color);
//通過(guò)this引用該構(gòu)造器正在初始化的Java對(duì)象
this.weight=weight;
}
}使用this調(diào)用另一個(gè)重載的構(gòu)造器只能在構(gòu)造器中使用,而且必須作為構(gòu)造器執(zhí)行體的第一條語(yǔ)句。使用this調(diào)用重載的構(gòu)造器時(shí),系統(tǒng)會(huì)根據(jù)this后括號(hào)里的實(shí)參來(lái)調(diào)用形參列表與之對(duì)應(yīng)的構(gòu)造器類(lèi)的繼承:Java繼承通過(guò)e*tends關(guān)鍵字來(lái)實(shí)現(xiàn)實(shí)現(xiàn)繼承的類(lèi)被稱(chēng)為子類(lèi),被繼承的類(lèi)被稱(chēng)為父類(lèi),有的也稱(chēng)為基類(lèi)、超類(lèi)。因?yàn)樽宇?lèi)是一種特殊的父類(lèi),因此父類(lèi)包含的范圍總比子類(lèi)包含的范圍要大。Java子類(lèi)不能獲得父類(lèi)的構(gòu)造器publicclassFruit{
publicdoubleweight;
publicvoidinfo(){
System.out.println(weight);
}
}publicclassApplee*tendsFruit{//Apple類(lèi)繼承了Fruit類(lèi),所以Apple對(duì)象也就有了weight成員變量和info()方法
publicstaticvoidmain(String[]args){
Applea=newApple();
//Apple對(duì)象本身沒(méi)有weight成員變量,但是,Apple父類(lèi)有weight成員變量,所以,也可以訪(fǎng)問(wèn)Apple對(duì)象的weight成員變量
a.weight=56;
//調(diào)用Apple對(duì)象的info()方法
();
}
}Java類(lèi)只能有一個(gè)直接父類(lèi),實(shí)際上,Java類(lèi)可以有無(wú)限多個(gè)間接父類(lèi)。重寫(xiě)父類(lèi)方法:子類(lèi)擴(kuò)展了父類(lèi),子類(lèi)是一個(gè)特殊的父類(lèi)。大部分時(shí)候,子類(lèi)總是以父類(lèi)為基礎(chǔ),額外增加新的成員變量和方法。但有一種情況例外:子類(lèi)需要重寫(xiě)父類(lèi)方法。publicclassBird{
//Bird類(lèi)的fly()方法
publicvoidfly(){
System.out.println("我在天空中飛");
}
}publicclassOstriche*tendsBird{
//重寫(xiě)B(tài)ird類(lèi)的fly()方法
publicvoidfly(){
System.out.println("我在陸地上飛");
}
publicstaticvoidmain(String[]args){
//創(chuàng)建Ostrich對(duì)象
Ostrichor=newOstrich();
//執(zhí)行Ostrich對(duì)象的fly()方法,將輸出"我在陸地上飛”
or.fly();
}
}這種子類(lèi)包含與父類(lèi)同名方法的現(xiàn)象被稱(chēng)為方法重寫(xiě)(Override),也被稱(chēng)為方法覆蓋??梢哉f(shuō)子類(lèi)重寫(xiě)了父類(lèi)的方法,也可以說(shuō)子類(lèi)覆蓋了父類(lèi)的方法。方法的重寫(xiě)要遵循"兩同兩小一大”規(guī)則,"兩同”即方法名相同、形參列表相同;"兩小”指的是子類(lèi)方法的返回值類(lèi)型應(yīng)比父類(lèi)方法返回值類(lèi)型更小或相等,子類(lèi)方法聲明拋出的異常類(lèi)應(yīng)比父類(lèi)聲明拋出的異常類(lèi)更小或相等;"一大”指的是子類(lèi)方法的訪(fǎng)問(wèn)權(quán)限應(yīng)比父類(lèi)方法的訪(fǎng)問(wèn)權(quán)限更大或相等。覆蓋方法和被覆蓋方法要么都是類(lèi)方法,要么都是實(shí)例方法。當(dāng)子類(lèi)覆蓋了父類(lèi)方法后,子類(lèi)的對(duì)象將無(wú)法訪(fǎng)問(wèn)父類(lèi)中被覆蓋的方法,但可以在子類(lèi)方法中調(diào)用被覆蓋的方法。如果需要在子類(lèi)方法中調(diào)用父類(lèi)中被覆蓋的方法,則可以使用super(被覆蓋的是實(shí)例方法)或者父類(lèi)類(lèi)名(被覆蓋的是類(lèi)方法)作為調(diào)用者來(lái)調(diào)用父類(lèi)中被覆蓋的方法。如果父類(lèi)方法具有private訪(fǎng)問(wèn)權(quán)限,則該方法對(duì)其子類(lèi)是隱藏的,因此其子類(lèi)無(wú)法訪(fǎng)問(wèn)該方法,也就是無(wú)法重寫(xiě)該方法。重載只要發(fā)生在同個(gè)類(lèi)多個(gè)同名方法之間,而重寫(xiě)發(fā)生在子類(lèi)和父類(lèi)同名方法之間。父類(lèi)方法和子類(lèi)方法之間也可能發(fā)生重載。Super限定:Super是Java提供的一個(gè)關(guān)鍵字,super用于限定該對(duì)象調(diào)用它從父類(lèi)繼承得到的實(shí)例變量或方法。Super不能出現(xiàn)在static修飾的方法中。Static修飾的方法是屬于類(lèi)的,該方法的調(diào)用者可能是一個(gè)類(lèi),而不是對(duì)象,因而super限定就失去了意義。如果在構(gòu)造器中使用super,則super用于限定該構(gòu)造器初始化的是該對(duì)象從父類(lèi)繼承得到的實(shí)例變量,而不是該類(lèi)自己定義的實(shí)例變量。如果子類(lèi)定義了和父類(lèi)同名的實(shí)例變量,則會(huì)發(fā)生子類(lèi)實(shí)例變量隱藏父類(lèi)實(shí)例變量的情形。在正常情況下,子類(lèi)里定義的方法直接訪(fǎng)問(wèn)該實(shí)例變量,默認(rèn)會(huì)訪(fǎng)問(wèn)到子類(lèi)中定義的實(shí)例變量,無(wú)法訪(fǎng)問(wèn)到父類(lèi)中被隱藏的實(shí)例變量。在子類(lèi)定義的實(shí)例方法中可以通過(guò)super來(lái)訪(fǎng)問(wèn)父類(lèi)中被隱藏的實(shí)例變量。publicclassBaseClass{
publicinta=5;
}publicclassSubClasse*tendsBaseClass{
publicinta=7;
publicvoidaccessOwner(){
System.out.println(a);
}
publicvoidaccessBase(){
//通過(guò)super來(lái)限定訪(fǎng)問(wèn)從父類(lèi)繼承得到的a實(shí)例變量
System.out.println(super.a);
}
publicstaticvoidmain(String[]args){
SubClasssb=newSubClass();
sb.accessBase();//輸出5
sb.accessOwner();//輸出7
}
}如果在*個(gè)方法中訪(fǎng)問(wèn)名為a的成員變量,但沒(méi)有顯式指定調(diào)用者,則系統(tǒng)查找a的順序?yàn)椋翰檎以摲椒ㄖ惺欠裼忻麨閍的局部變量查找當(dāng)前類(lèi)中是否包含名為a的成員變量查找a的直接父類(lèi)中是否包含名為a的成員變量,一次上溯a的所有父類(lèi),直到類(lèi),如果最終不能找到名為a的成員變量,則系統(tǒng)出現(xiàn)編譯錯(cuò)誤。如果被覆蓋的是類(lèi)變量,在子類(lèi)的方法中則可以通過(guò)父類(lèi)名作為調(diào)用者來(lái)訪(fǎng)問(wèn)被覆蓋的類(lèi)變量當(dāng)程序創(chuàng)建一個(gè)子類(lèi)對(duì)象時(shí),系統(tǒng)不僅會(huì)為該類(lèi)中定義的實(shí)例變量分配內(nèi)存,也會(huì)為它從父類(lèi)繼承得到的所有實(shí)例變量分配內(nèi)存,即使子類(lèi)定義了與父類(lèi)中同名的實(shí)例變量。如果在子類(lèi)里定義了與父類(lèi)中已有變量同名的變量,則子類(lèi)中定義的變量會(huì)隱藏父類(lèi)中定義的變量。注意不是完全覆蓋,因此系統(tǒng)在創(chuàng)建子類(lèi)對(duì)象時(shí),依然會(huì)為父類(lèi)中定義的、被隱藏的變量分配內(nèi)存空間。publicclassParent{
publicStringtag="helloworld";
}publicclassDerivede*tendsParent{
//定義一個(gè)私有的tag實(shí)例變量來(lái)隱藏父類(lèi)的tag實(shí)例變量
privateStringtag="abc";
}publicclassHideTest{
publicstaticvoidmain(String[]args){
Derivedd=newDerived();
//程序不可訪(fǎng)問(wèn)d的私有變量tag,所以會(huì)出現(xiàn)編譯錯(cuò)誤
//System.out.println(d.tag);
//將d變量顯式的向上轉(zhuǎn)型為Parent后,即可訪(fǎng)問(wèn)tag實(shí)例變量
System.out.println(((Parent)d).tag);
}
}調(diào)用父類(lèi)構(gòu)造器:子類(lèi)不會(huì)獲得父類(lèi)的構(gòu)造器,但子類(lèi)構(gòu)造器里可以調(diào)用父類(lèi)構(gòu)造器的初始化代碼。在一個(gè)構(gòu)造器里調(diào)用另一個(gè)重載的構(gòu)造器使用this調(diào)用來(lái)完成,在子類(lèi)構(gòu)造器中調(diào)用父類(lèi)構(gòu)造器使用super調(diào)用來(lái)完成。publicclassBase{
publicdoublesize;
publicStringname;
publicBase(doublesize,Stringname){
this.size=size;
=name;
}
}publicclassSube*tendsBase{
publicStringcolor;
publicSub(doublesize,Stringname,Stringcolor){
//通過(guò)super調(diào)用父類(lèi)構(gòu)造器的初始化過(guò)程
super(size,name);
this.color=color;
}
publicstaticvoidmain(String[]args){
Subs=newSub(5.6,"測(cè)試","red");
System.out.println(s.size+","++","+s.color);
}
}Super調(diào)用的是其父類(lèi)的構(gòu)造器,而this調(diào)用的是同一個(gè)類(lèi)中重載的構(gòu)造器;因此,使用super調(diào)用父類(lèi)的構(gòu)造器也必須出現(xiàn)在子類(lèi)構(gòu)造器執(zhí)行體的第一行,所以this調(diào)用和super調(diào)用不會(huì)同時(shí)出現(xiàn)。當(dāng)調(diào)用子類(lèi)構(gòu)造器來(lái)初始化子類(lèi)對(duì)象時(shí),父類(lèi)構(gòu)造器總會(huì)在子類(lèi)構(gòu)造器之前執(zhí)行;不僅如此,執(zhí)行父類(lèi)構(gòu)造器時(shí),系統(tǒng)會(huì)再次上溯執(zhí)行其父類(lèi)的構(gòu)造器……依次類(lèi)推,創(chuàng)建任何java對(duì)象,最先執(zhí)行的總是類(lèi)的構(gòu)造器。publicclassCreature{
publicCreature(){
System.out.println("無(wú)參");
}
}publicclassAnimale*tendsCreature{
publicAnimal(Stringname){
System.out.println("Animal帶一個(gè)參數(shù)的構(gòu)造器"+name);
}
publicAnimal(Stringname,intage){
//this調(diào)用同一個(gè)重載構(gòu)造器
this(name);
System.out.println("Animal帶兩個(gè)參數(shù)的構(gòu)造器"+age);
}
}publicclassWolfe*tendsAnimal{
publicWolf(){
super("灰太狼",4);
System.out.println("wolf無(wú)參構(gòu)造器");
}
publicstaticvoidmain(String[]args){
Wolfwf=newWolf();
//雖然main方法只創(chuàng)建了一個(gè)Wolf對(duì)象,但系統(tǒng)在底層完成了復(fù)雜的操作,運(yùn)行將會(huì)得到
//無(wú)參
//Animal帶一個(gè)參數(shù)的構(gòu)造器灰太狼
//Animal帶兩個(gè)參數(shù)的構(gòu)造器4
//wolf無(wú)參構(gòu)造器
}
}創(chuàng)建任何對(duì)象總是從該類(lèi)所在繼承樹(shù)最頂層類(lèi)的構(gòu)造器開(kāi)始執(zhí)行,然后依次向下執(zhí)行,最后才執(zhí)行本類(lèi)的構(gòu)造器。如果*個(gè)父類(lèi)通過(guò)this調(diào)用了同類(lèi)中重載的構(gòu)造器,就會(huì)依次執(zhí)行此父類(lèi)的多個(gè)構(gòu)造器。4.7多態(tài):Java引用變量有兩個(gè)類(lèi)型:一個(gè)是編譯時(shí)類(lèi)型,一個(gè)是運(yùn)行時(shí)類(lèi)型。編譯時(shí)類(lèi)型由聲明該變量時(shí)使用的類(lèi)型決定,運(yùn)行時(shí)類(lèi)型由實(shí)際賦給該變量的對(duì)象決定。如果編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型不一致,就可能出現(xiàn)所謂的多態(tài)。publicclassBaseClass{
publicintbook=6;
publicvoidbase(){
System.out.println("父類(lèi)的普通方法");
}
publicvoidtest(){
System.out.println("父類(lèi)被覆蓋的方法");
}
}publicclassSubClasse*tendsBaseClass{
//重寫(xiě)定義一個(gè)book實(shí)例變量隱藏父類(lèi)的book實(shí)例變量
publicStringbook="abc";
publicvoidtest(){
System.out.println("子類(lèi)的覆蓋父類(lèi)的方法");
}
publicvoidsub(){
System.out.println("子類(lèi)的普通方法");
}
publicstaticvoidmain(String[]args){
//編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型完全一樣,因此不存在多態(tài)
BaseClassbc=newBaseClass();
//輸出父類(lèi)bc對(duì)象的成員變量值:6
System.out.println(bc.book);
bc.test();
bc.base();
//編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型完全一樣,因此不存在多態(tài)
SubClasssbc=newSubClass();
//輸出子類(lèi)對(duì)象sbc的成員變量值:abc
System.out.println(sbc.book);
sbc.test();
sbc.sub();
//下面調(diào)用將執(zhí)行從父類(lèi)繼承到的base()方法
sbc.base();
//編譯時(shí)類(lèi)型和運(yùn)行時(shí)類(lèi)型不一樣,發(fā)生多態(tài)發(fā)生
BaseClassployBc=newSubClass();
//訪(fǎng)問(wèn)的是父類(lèi)對(duì)象的實(shí)例變量
System.out.println(ployBc.book);
//執(zhí)行從父類(lèi)繼承到的base()方法
ployBc.base();
//調(diào)用將執(zhí)行當(dāng)前類(lèi)的test()方法
ployBc.test();
//ployBc.sub();因?yàn)榫幾g時(shí)類(lèi)型是BaseClass,沒(méi)有提供sub()方法,所以編譯會(huì)出現(xiàn)錯(cuò)誤
}
}因?yàn)樽宇?lèi)是一種特殊的父類(lèi),因此java允許把一個(gè)子類(lèi)對(duì)象直接賦給一個(gè)父類(lèi)引用變量,無(wú)須任何類(lèi)型轉(zhuǎn)換,或者被稱(chēng)為向上轉(zhuǎn)型,向上轉(zhuǎn)型由系統(tǒng)自動(dòng)完全。對(duì)象的實(shí)例變量不具備多態(tài)性。注:引用變量在編譯階段只能調(diào)用其編譯時(shí)類(lèi)型所具有的方法,但運(yùn)行時(shí)則執(zhí)行它運(yùn)行時(shí)類(lèi)型所具有的方法。因此在編寫(xiě)Java代碼時(shí),引用變量只能調(diào)用聲明該變量時(shí)所用類(lèi)里包含的方法。例如:Objectp=newPerson()代碼定義了一個(gè)變量P,則這個(gè)P只能調(diào)用Object類(lèi)的方法,而不能調(diào)用Person類(lèi)里的方法。如果需要讓這個(gè)引用變量調(diào)用它運(yùn)行時(shí)類(lèi)型的方法,則必須把它強(qiáng)制類(lèi)型轉(zhuǎn)化成運(yùn)行時(shí)的類(lèi)型,強(qiáng)制類(lèi)型轉(zhuǎn)換符需要借助于類(lèi)型轉(zhuǎn)換運(yùn)算符,用法是(type)variable強(qiáng)制類(lèi)型轉(zhuǎn)換需要注意:基本類(lèi)型之間的轉(zhuǎn)換只能在數(shù)值類(lèi)型之間進(jìn)行,這里所說(shuō)的數(shù)值類(lèi)型包括,整數(shù)型、字符型和浮點(diǎn)型;但數(shù)值類(lèi)型和布爾類(lèi)型之間不能進(jìn)行類(lèi)型轉(zhuǎn)換。引用類(lèi)型之間的轉(zhuǎn)換只能在具有繼承關(guān)系的兩個(gè)類(lèi)型之間進(jìn)行,如果是兩個(gè)沒(méi)有任何繼承關(guān)系的類(lèi)型,則無(wú)法進(jìn)行類(lèi)型轉(zhuǎn)換。考慮到強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí)可能出現(xiàn)異常,因此進(jìn)行類(lèi)型轉(zhuǎn)換之前應(yīng)先通過(guò)instanceof運(yùn)算符來(lái)判斷是否可以成功轉(zhuǎn)換。注意:當(dāng)把子類(lèi)對(duì)象賦給父類(lèi)引用變量時(shí),被稱(chēng)為向上轉(zhuǎn)型,這種轉(zhuǎn)型總是可以成功的,這也從另一個(gè)側(cè)面證實(shí)了子類(lèi)是一種特殊的父類(lèi)。這種轉(zhuǎn)型只是表明這個(gè)引用變量的編譯時(shí)類(lèi)型是父類(lèi),但實(shí)際執(zhí)行它的方法時(shí),依然表現(xiàn)出子類(lèi)對(duì)象行為方式。但把一個(gè)父類(lèi)對(duì)象賦給子類(lèi)引用變量時(shí),就需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,而且還可能在運(yùn)行時(shí)產(chǎn)生ClassCastE*ception異常,使用instanceof運(yùn)算符可以讓強(qiáng)制類(lèi)型轉(zhuǎn)換更安全。Instanceof運(yùn)算符:Instanceof運(yùn)算符前一個(gè)操作數(shù)通常是一個(gè)引用類(lèi)型變量,后一個(gè)操作數(shù)通常是一個(gè)類(lèi)(也可以是接口),它用于判斷前面的對(duì)象是否是后面的類(lèi),或者其子類(lèi)、實(shí)現(xiàn)的實(shí)例。如果是,則返回ture,否則返回false.在使用instanceof運(yùn)算符時(shí)需要注意:instanceof運(yùn)算符前面操作數(shù)的編譯時(shí)類(lèi)型要么與后面的類(lèi)相同,要么與后面的類(lèi)具有父子繼承關(guān)系,否則會(huì)引起編譯錯(cuò)誤。publicclassinstanceofTest{
publicstaticvoidmain(String[]args){
//聲明hello時(shí)使用Object類(lèi),則hello的編譯類(lèi)型是Object
//Object是所有類(lèi)的父類(lèi),但hello變量的實(shí)際類(lèi)型是String
Objecthello="hello";
System.out.println((helloinstanceofObject));
//String和Object類(lèi)存在繼承關(guān)系,可以進(jìn)行instanceof運(yùn)算,返回true
System.out.println((helloinstanceofString));
//Math和Object類(lèi)存在繼承關(guān)系,可以進(jìn)行instanceof運(yùn)算,返回false
System.out.println((helloinstanceofMath));
//String實(shí)現(xiàn)了Comparabel接口,所以返回true
System.out.println((helloinstanceofComparable));
Stringa="hello";
//String類(lèi)和Math類(lèi)沒(méi)有繼承關(guān)系,所以下面的代碼編譯無(wú)法通過(guò)
//System.out.println((ainstanceofMath));
}
}4.8初始化塊:初始化塊是一段固定執(zhí)行的代碼,它不能接受任何參數(shù)。因此初始化塊對(duì)同一個(gè)類(lèi)的所有對(duì)象所進(jìn)行的的初始化處理完全相同。如果兩個(gè)構(gòu)造器中有相容的初始化代碼,且這些初始化代碼無(wú)須接收參數(shù),就可以把它們放在初始化塊中定義。當(dāng)創(chuàng)建java對(duì)象時(shí),系統(tǒng)總是先調(diào)用該類(lèi)里定義的初始化塊,相同類(lèi)型的初始化塊之間按順序執(zhí)行。初始化塊在執(zhí)行構(gòu)造器之前執(zhí)行。與構(gòu)造器類(lèi)型,創(chuàng)建一個(gè)java對(duì)象時(shí),不僅會(huì)執(zhí)行該類(lèi)的普通初始化塊和構(gòu)造器,而且系統(tǒng)會(huì)一直上溯到類(lèi),先執(zhí)行類(lèi)的初始化塊,再開(kāi)始執(zhí)行的構(gòu)造器,依次向下執(zhí)行其子類(lèi)的初始化塊,再開(kāi)始執(zhí)行其子類(lèi)的構(gòu)造器…最后才執(zhí)行該類(lèi)的初始化塊和構(gòu)造器,返回該類(lèi)的對(duì)象。靜態(tài)初始化塊:如果定義初始化塊時(shí)使用了static修飾符,則這個(gè)初始化塊就變成了靜態(tài)初始化塊,也被稱(chēng)為類(lèi)初始化塊(普通初始化塊負(fù)責(zé)對(duì)對(duì)象執(zhí)行初始化,類(lèi)初始化塊則負(fù)責(zé)對(duì)類(lèi)進(jìn)行初始化)。靜態(tài)初始化塊總是類(lèi)相關(guān)的,系統(tǒng)將在類(lèi)初始化階段執(zhí)行靜態(tài)初始化塊,而不是在創(chuàng)建對(duì)象時(shí)才執(zhí)行。因此靜態(tài)初始化塊總是比普通初始化塊先執(zhí)行。通常靜態(tài)初始化塊用于對(duì)類(lèi)變量執(zhí)行初始化處理。與普通初始化塊類(lèi)型,系統(tǒng)在類(lèi)初始化階段執(zhí)行靜態(tài)初始化塊時(shí),不僅會(huì)執(zhí)行本類(lèi)的靜態(tài)初始化塊,而且還會(huì)一直上溯到類(lèi),從最高父類(lèi)開(kāi)始一直到本類(lèi)結(jié)束,依次執(zhí)行每個(gè)類(lèi)中的靜態(tài)初始化塊。publicclassTest{
publicstaticvoidmain(String[]args){
newLeaf();
newLeaf();
}
}
classRoot{
static{
System.out.println("Root的靜態(tài)初始化塊");
}
{
System.out.println("Root的初始化塊");
}
publicRoot(){
System.out.println("Root的無(wú)參構(gòu)造器");
}
}
classMide*tendsRoot{
static{
System.out.println("Mid的靜態(tài)初始化塊");
}
{
System.out.println("Mid的初始化塊");
}
publicMid(){
System.out.println("Mid的無(wú)參構(gòu)造器");
}
publicMid(Stringmsg){
//通過(guò)this調(diào)用同一類(lèi)中重載的構(gòu)造器
this();
System.out.println("Mid的帶有參數(shù)的構(gòu)造器");
}
}
classLeafe*tendsMid{
static{
System.out.println("Leaf的靜態(tài)初始化塊");
}
{
System.out.println("Leaf的初始化塊");
}
publicLeaf(){
super("abc");
System.out.println("執(zhí)行Leaf的構(gòu)造器");
}
}Root的靜態(tài)初始化塊Mid的靜態(tài)初始化塊Leaf的靜態(tài)初始化塊Root的初始化塊Root的無(wú)參構(gòu)造器Mid的初始化塊Mid的無(wú)參構(gòu)造器Mid的帶有參數(shù)的構(gòu)造器Leaf的初始化塊執(zhí)行Leaf的構(gòu)造器Root的初始化塊Root的無(wú)參構(gòu)造器Mid的初始化塊Mid的無(wú)參構(gòu)造器Mid的帶有參數(shù)的構(gòu)造器Leaf的初始化塊執(zhí)行Leaf的構(gòu)造器類(lèi)初始化階段,先執(zhí)行最頂層父類(lèi)的靜態(tài)初始化塊,然后依次向下,直到執(zhí)行當(dāng)前類(lèi)的初始化塊。對(duì)象初始化階段,先執(zhí)行最頂層父類(lèi)的初始化塊、最頂層父類(lèi)的構(gòu)造器,然后依次向下,直到執(zhí)行當(dāng)前類(lèi)的初始化塊、當(dāng)前類(lèi)的構(gòu)造器Java系統(tǒng)加載并初始化*個(gè)類(lèi)時(shí),總是保證該類(lèi)的所有父類(lèi)(包括直接父類(lèi)和間接父類(lèi))全部加載并進(jìn)行初始化。靜態(tài)初始化塊和靜態(tài)成員變量的執(zhí)行順序與在源程序中排列順序相同。第五章面向?qū)ο笙?.1java增強(qiáng)的包裝類(lèi)為了解決8種基本類(lèi)型的變量不能當(dāng)成Object類(lèi)型變量使用的問(wèn)題,java提供了包裝類(lèi)的概念。除了int和char有點(diǎn)例外,其他的基本數(shù)據(jù)類(lèi)型對(duì)應(yīng)的包裝類(lèi)都是將其首字母大寫(xiě)即可。自動(dòng)裝箱和自動(dòng)拆箱用法:publicclassAutoBo*ingUnbo*ing{
publicstaticvoidmain(String[]args){
//直接把一個(gè)基本類(lèi)型變量賦給Integer對(duì)象
IntegerinObj=5;
//直接把一個(gè)boolean類(lèi)型變量賦給Object類(lèi)型變量
ObjectboolObj=true;
//直接把一個(gè)Integer對(duì)象賦給int類(lèi)型變量
intit=inObj;
if(boolObjinstanceofBoolean){
//先把Object對(duì)象強(qiáng)制類(lèi)型轉(zhuǎn)換為Boolean類(lèi)型,再賦給boolean變量
booleanb=(Boolean)boolObj;
System.out.println(b);
}
}
}包裝類(lèi)還可實(shí)現(xiàn)基本類(lèi)型變量和字符串之間的轉(zhuǎn)換。把字符串類(lèi)型的值轉(zhuǎn)換為基本類(lèi)型的值有兩種方式:利用包裝類(lèi)提供的parse***(Strings)靜態(tài)方法利用包裝類(lèi)提供的***(Strings)構(gòu)造器String類(lèi)提供了多個(gè)重載的valueOf()方法,用于將基本類(lèi)型變量轉(zhuǎn)換成字符串。publicclassPrimitive2String{
publicstaticvoidmain(String[]args){
StringintStr="123";
//把一個(gè)特定的字符串轉(zhuǎn)換成int變量
intit1=Integer.parseInt(intStr);
intit2=newInteger(intStr);
System.out.println(it2);
StringfloatStr="4.56";
//把一個(gè)特定的字符串轉(zhuǎn)換成float變量
floatft1=Float.parseFloat(floatStr);
floatft2=newFloat(floatStr);
//把一個(gè)float變量轉(zhuǎn)換成String變量
StringftStr=String.valueOf(2.345f);
System.out.println(ftStr);
//把一個(gè)double變量轉(zhuǎn)換成String變量
StringdbStr=String.valueOf(3.344);
System.out.println(dbStr);
//把一個(gè)boolean變量轉(zhuǎn)換成String變量
StringboolStr=String.valueOf(true);
System.out.println(boolStr.toUpperCase());
}
}如果希望把基本類(lèi)型變量轉(zhuǎn)換成字符串,還有一種更簡(jiǎn)單的方法:將基本類(lèi)型變量和””進(jìn)行連接運(yùn)算,系統(tǒng)會(huì)自動(dòng)把基本類(lèi)型變量轉(zhuǎn)換成字符串。雖然包裝類(lèi)型的變量時(shí)引用數(shù)據(jù)類(lèi)型,但包裝類(lèi)的實(shí)例可以與數(shù)值類(lèi)型的值進(jìn)行比較,這種比較是直接取出包裝類(lèi)實(shí)例所包裝的數(shù)值來(lái)進(jìn)行比較的。publicclassTestDemo{
publicstaticvoidmain(String[]args){
Integera=newInteger(6);
System.out.println(a>5);
//兩個(gè)包裝類(lèi)實(shí)例進(jìn)行比較時(shí),只有兩個(gè)包裝類(lèi)引用指向同一個(gè)對(duì)象時(shí)才返回ture
System.out.println(newInteger(2)==newInteger(2));
}
}系統(tǒng)把一個(gè)-128-127之間的證書(shū)自動(dòng)裝箱成Integer實(shí)例,并放入了一個(gè)名為cache的數(shù)組中緩存起來(lái)。如果以后把一個(gè)-128-127之間的整數(shù)自動(dòng)裝箱成一個(gè)Integer實(shí)例時(shí),實(shí)際上是直接指向?qū)?yīng)的數(shù)組元素,因此-128-127之間的同一個(gè)整數(shù)自動(dòng)裝箱成Integer實(shí)例時(shí),永遠(yuǎn)都是引用cache數(shù)組的同一個(gè)數(shù)組元素,所以它們都相等。但如果整數(shù)不在這個(gè)范圍內(nèi),則會(huì)重新創(chuàng)建一個(gè)Integer實(shí)例。publicclassTestDmo2{
publicstaticvoidmain(String[]args){
Integera=2;
Integerb=2;
System.out.println(a==b);//true
Integerbiga=128;
Integerbigb=128;
System.out.println(biga==bigb);//false
}
}5.2處理對(duì)象對(duì)象打印的誤區(qū):publicclassPrintObject{
publicstaticvoidmain(String[]args){
Personp=newPerson("Peter");
//如果想打印p對(duì)象的內(nèi)容,下面兩種方法都不可以,打出來(lái)的都是地址值
//Object類(lèi)提供的toString()方法總是返回該對(duì)象實(shí)現(xiàn)類(lèi)的"類(lèi)名++hashCode”的值
System.out.println(p);
System.out.println(p.toString());
}
}
classPerson{
privateStringname;
publicPerson(Stringname)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)高速膠板市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)防裂劑市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)鋼襯四氟反應(yīng)塔市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)超高速單線(xiàn)機(jī)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)現(xiàn)場(chǎng)總線(xiàn)連接器市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)液壓搬運(yùn)車(chē)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)氨基模塑料市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)抗菌接頭市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)平底試劑槽市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)獎(jiǎng)狀市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030石墨電極行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 江蘇省高郵市2025屆八下英語(yǔ)期末調(diào)研模擬試題含答案
- 垃圾爐渣廠(chǎng)管理制度
- 2025安全生產(chǎn)月一把手講安全公開(kāi)課主題宣講三十三(60P)
- 2025至2030中國(guó)二甲醚汽車(chē)行業(yè)市場(chǎng)分析及競(jìng)爭(zhēng)形勢(shì)與發(fā)展前景預(yù)測(cè)報(bào)告
- 統(tǒng)編版七年級(jí)歷史上冊(cè)期末復(fù)習(xí)課件
- 兒童用藥合理使用課件
- 2025-2030年中國(guó)發(fā)泡包裝行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025至2030中國(guó)材料疲勞試驗(yàn)機(jī)行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025年陜西、山西、寧夏、青海四?。儠x寧青)高考 生物真題試卷 附答案
- 2024年西昌市教育和體育局考核聘用公立幼兒園教師真題
評(píng)論
0/150
提交評(píng)論