版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
...wd......wd......wd...Java學(xué)習(xí)筆記Java概述java語(yǔ)言是解釋執(zhí)行,java源碼是通過(guò)編譯生成一種特殊的.class的中間字解碼文件,然后再有JVM進(jìn)展解釋執(zhí)行。java語(yǔ)言對(duì)指針進(jìn)展了上層的封裝,它保證能夠通過(guò)這個(gè)指針〔引用〕來(lái)訪問(wèn)有效的內(nèi)存單元。java語(yǔ)言不允許多繼承,使繼承關(guān)系成樹裝圖,每個(gè)類都只能由一個(gè)父類。java語(yǔ)言的開發(fā)效率高,但執(zhí)行效率低?!蚕喈?dāng)于c++的55%〕java的垃圾回收機(jī)制,在java中new的對(duì)象不需要向c++一樣進(jìn)展delete操作,JVM會(huì)根據(jù)情況回收垃圾對(duì)象。〔懶漢機(jī)制,等待資源沒(méi)有的時(shí)候才回收〕我們只能夠建議JVM進(jìn)展垃圾回收,例如〔System.gc()RunTime.gc()這兩個(gè)方法就是建議JVM進(jìn)展垃圾回收的方法〕JDK,java開發(fā)工具包〔類庫(kù)和運(yùn)行命令〕,JRE,java運(yùn)行環(huán)境,JVM,java虛擬機(jī)〔解釋執(zhí)行的核心,對(duì)字節(jié)碼進(jìn)展翻譯成運(yùn)行環(huán)境的機(jī)器碼,它可以屏蔽平臺(tái)差異。JVM是不跨平臺(tái)的?!矹AVA_HOME,指明JDK安裝的位置,CLASSPATH,指明類文件的位置,PATH,指明命令的可執(zhí)行文件的位置。java源文件的文件名必須和文件中定義publicclass的類名〔大小寫頁(yè)要一樣〕一樣。java源代碼中的main方法的定義寫法。main方法是程序的入口。
publicstaticvoidmain(String[]args){
System.out.println("Helloworld");
}
java源文件也要先編譯,使用javacxxx.java格式的命令得來(lái)編譯,使用javaxxx來(lái)運(yùn)行。定義包構(gòu)造要放在有效代碼的第一行,packagexxx.xxx,包的定義在一個(gè)程序中只能由一個(gè),在加上包定義之后編譯可以使用javac-d路徑xxxx.java,這個(gè)-d這個(gè)命令行的參數(shù)可以指定包構(gòu)造的位置“.〞代表當(dāng)前目錄。在運(yùn)行時(shí)要使用類的全名
javaxxx.xxx.xxxx用包名以點(diǎn)分隔。運(yùn)行時(shí)要在包構(gòu)造的上一層目錄來(lái)運(yùn)行。java中的注釋單行注釋//......
多行注釋/*.......*/文檔注釋/**........<p>(換行標(biāo)簽)*/,用javadoc命令可以根據(jù)原碼中的文檔注釋生成注釋文檔〔html格式〕。文檔注釋中可以使用html標(biāo)簽。
javadoc-d路徑〔指定注釋文檔的保存路徑〕文檔注釋一般寫在類定義之前,方法之前,屬性之前。在文檔注釋中可以用@author表示程序的作者,@version表示程序的版本,前兩個(gè)注釋符號(hào)要寫在類定義之前,用于方法的注釋@param對(duì)參數(shù)進(jìn)展注釋,@return對(duì)返回值進(jìn)展注釋@throws對(duì)拋出異常的注釋。jar命令用于打一個(gè)xxx.jar文件用法:jar{ctxu}[vfm0Mi][jar-文件][manifest-文件][-C目錄](méi)文件名...選項(xiàng):
-c創(chuàng)立新的存檔
-t列出存檔內(nèi)容的列表
-x展開存檔中的命名的〔或所有的〕文件
-u更新已存在的存檔
-v生成詳細(xì)輸出到標(biāo)準(zhǔn)輸出上
-f指定存檔文件名
-m包含來(lái)自標(biāo)明文件的標(biāo)明信息
-0只存儲(chǔ)方式;未用ZIP壓縮格式
-M不產(chǎn)生所有項(xiàng)的清單〔manifest〕文件
-i為指定的jar文件產(chǎn)生索引信息
-C改變到指定的目錄,并且包含以下文件:如果一個(gè)文件名是一個(gè)目錄,它將被遞歸處理。清單〔manifest〕文件名和存檔文件名都需要被指定,按'm'和'f'標(biāo)志指定的一樣順序例如1:將兩個(gè)class文件存檔到一個(gè)名為'classes.jar'的存檔文件中:
jarcvfclasses.jarFoo.classBar.class
例如2:用一個(gè)存在的清單〔manifest〕文件'mymanifest'將foo/目錄下的所有文件存檔到一個(gè)名為'classes.jar'的存檔文件中:
jarcvfmclasses.jarmymanifest-Cfoo/。一般在使用使用jarcvf文件名.jar文件所在路徑〔xxx/xxx/xxx.class〕也可以壓縮一個(gè)目錄,只要在制定路徑是指定為文件夾,jar命令的命令行參數(shù)在使用時(shí)可以以“-〞開頭,也可以不用。java程序的運(yùn)行過(guò)程,首先是啟動(dòng)java虛擬機(jī),然后就是去找.class文件,先是從系統(tǒng)的類庫(kù)中找〔系統(tǒng)之會(huì)在跟目錄下查找,所以需要完整類名〕,如果找不到的話會(huì)去CLASSPATH所設(shè)置的目錄去找。然后加載到j(luò)ava虛擬機(jī)中。系統(tǒng)會(huì)在每個(gè)java程序中隱含導(dǎo)入了java.lang這個(gè)包,import包名,導(dǎo)入包中的類文件。java.lang包,這是一個(gè)基礎(chǔ)包。java.util包,這個(gè)包是工具類的包。java.io包,這個(gè)包是用于輸入輸出操作的包,這個(gè)包是用于網(wǎng)絡(luò)編程。java.awt,java.swing,javax.swing,java.event等包用于圖形編程用的包。
applactionjava的應(yīng)用程序,java應(yīng)用程序中必須有一個(gè)main()方法。標(biāo)識(shí)符和關(guān)鍵字Java代碼中的“;〞、“{}〞、“〞
Java語(yǔ)句以分號(hào)分隔,Java代碼塊包含在大括號(hào)內(nèi),忽略空格.標(biāo)識(shí)符1)用以命名類、方法和變量、以及包遵守JAVA的命名標(biāo)準(zhǔn)類以每個(gè)單詞都以大寫字母開頭。方法和變量第一個(gè)字母不大寫,其他照舊。
2)只能以字符、“_〞或“$〞開頭;3)無(wú)長(zhǎng)度限制。java中的關(guān)鍵字goto和const在java中雖然不再使用但是還作為關(guān)鍵字存在java中沒(méi)有sizeof這個(gè)關(guān)鍵字了,java中的boolean類型的值只能用true和false,且這兩值也是關(guān)鍵字。java語(yǔ)言中沒(méi)有無(wú)符號(hào)這個(gè)關(guān)鍵字〔unsigned〕java中的數(shù)據(jù)類型1)整型
byte1字節(jié)8位-128到127
short2字節(jié)16位-2^15到2^15-1
int4字節(jié)32位-2^31到2^31-1
long8字節(jié)64位-2^63到2^63-12)浮點(diǎn)類型
float4字節(jié)32位
double8字節(jié)64位3)字符類型
char2字節(jié)16位4)布爾型
booleanfalse/true
注:1)char是無(wú)符號(hào)的16位整數(shù),字面值必須用單引號(hào)括起來(lái);‘a(chǎn)’2)String是類,非原始數(shù)據(jù)類型;3)長(zhǎng)整型數(shù)字有一個(gè)后綴為“L〞或“l(fā)〞,八進(jìn)制前綴為“0〞,十六進(jìn)制前綴為“0x〞;4)黙認(rèn)浮點(diǎn)類型為double;
5)float數(shù)據(jù)類型有一個(gè)后綴為“f〞或“F〞,Double數(shù)據(jù)類型后可跟后綴“D〞或“d“6)char類型也可以用通用轉(zhuǎn)譯字符,但是不能用ASCII碼??梢杂谩癨u0000〞這種格式,因?yàn)閏har型中使用的是unicode編碼方式。注:整型值存放,正數(shù)存放原碼〔二進(jìn)制碼〕,負(fù)數(shù)則存放補(bǔ)碼〔原碼按位取反末位加一〕。注:實(shí)型值在存儲(chǔ)時(shí)會(huì)損失精度,所以不要直接比較兩個(gè)實(shí)型值。系統(tǒng)默認(rèn)的實(shí)型都是double型,要使用時(shí)要在數(shù)據(jù)后加個(gè)f,或者強(qiáng)行轉(zhuǎn)換。強(qiáng)轉(zhuǎn)〔占字節(jié)數(shù)大的類型轉(zhuǎn)到占字節(jié)數(shù)小的類型〕時(shí)會(huì)放棄高位值只取低位值。java中的數(shù)字?jǐn)?shù)據(jù)類型減災(zāi)由占字節(jié)數(shù)小的類型到占字節(jié)數(shù)大的類型的可以有自動(dòng)轉(zhuǎn)換,反之則需要強(qiáng)行轉(zhuǎn)換,char型和int型之間可以相互轉(zhuǎn)換。char和short不能像戶轉(zhuǎn)換。注意:隱式類型轉(zhuǎn)換;
a運(yùn)算符b,如果a,b中有任意一個(gè)是double型,前面運(yùn)算的結(jié)果就是double型,如果a,b中有任意一個(gè)是float型,前面運(yùn)算的結(jié)果就是float型,如果a,b中有任意一個(gè)是long型,前面運(yùn)算的結(jié)果就是long型,如果a,b中沒(méi)有double、float、long型,那么其結(jié)果就為int型。所有基本數(shù)據(jù)類型在使用時(shí)會(huì)事先分配空間,只本身就存在空間中,在傳遞時(shí),就是值傳遞,不是引用傳遞。在類中定義的方法在返回值前加上static修飾符就可以在main方法中調(diào)用了。如果不用static那就需要在main方法中創(chuàng)立對(duì)象,使用對(duì)象來(lái)調(diào)用對(duì)象的方法。
publicclassTest{
publicstaticvoidmain(String[]args){
Testt=newTest();intb=1;intc=2;int[]a=newint[10];t.sqort(a);
add(b,c)
}
publicint[]sqort(int[]a){
.......
}
staticintadd(b,c){
.......
}
}
java中的運(yùn)算符〔java的運(yùn)算符的優(yōu)先級(jí)和結(jié)合性和c++一樣〕
System.out.println(3/2)按整型計(jì)算得1
1)>>=前面是零補(bǔ)零,前面是一補(bǔ)一;
2)>>>=無(wú)符號(hào)右移〔強(qiáng)制右移都會(huì)移進(jìn)一〕,
>>=和>>>=對(duì)于負(fù)數(shù)不一樣正數(shù):右移n位等于除以2的n次方負(fù)數(shù):變成正數(shù)。
3)&&短路與,前面為假,表達(dá)式為假,后面的操作不會(huì)進(jìn)展,&會(huì)對(duì)所有條件進(jìn)展判斷。
4)||短路或,前面為真,表達(dá)式為真,后面的操作不會(huì)進(jìn)展,|會(huì)對(duì)所有條件進(jìn)展判斷。例:
if(a<3&(b=a)==0)b賦值
if(a<3&&(b=a)==0)b不賦值5)instanceof,是用于判斷一個(gè)對(duì)象是否屬于某個(gè)類型6)java中的求余運(yùn)算符“%〞可以對(duì)兩個(gè)實(shí)型變量求余注:按位與是為了讓某些位置一,按位或是令某些位置零,按位異或是令某些位取反。注:使用左右位移和無(wú)符號(hào)右移運(yùn)算符的使用方法是變量名<<=位移位數(shù),變量名>>=位移位數(shù)(前兩個(gè)運(yùn)算符是不會(huì)忽略整形符號(hào)位,也稱邏輯位移),變量名>>>=位移位數(shù)注意:左右位移和無(wú)符號(hào)右移運(yùn)算符只能用于整形及其兼容類型〔byte,int,short,long〕注意:java程序的運(yùn)行過(guò)程,首先是啟動(dòng)java虛擬機(jī),然后就是去找。class文件,先是從系統(tǒng)的類庫(kù)中找〔系統(tǒng)之會(huì)在跟目錄下查找,所以需要完整類名〕,如果找不到的話會(huì)去CLASSPATH所設(shè)置的目錄去找。然后加載到j(luò)ava虛擬機(jī)中。如果要使用到其他的在JAVA_HOME中沒(méi)有的類或者是其他公司提供的第三方的。jar〔jar包〕文件時(shí),要把它的路徑及文件名加到CLASSPATH中。java的流程控制控制流
if()
if()….else
if()…..elseif()….else
注意:else只是和其上面的同層的最近的if()來(lái)配對(duì)。
switch(){
case'a':……..
case1:……break;
default:
…………
}
注解:switch()內(nèi)數(shù)據(jù)類型為byteshortcharint類型,只有以上四種類型的才可以在switch()中使用。case塊中不加break時(shí)順序執(zhí)行下面的語(yǔ)句。循環(huán)語(yǔ)句
for(inti=0;i<n;i++){}
while(){}
do{}while();-----------注意加分號(hào)例子:
loop:for(inti=0;i<n;i++)
{
for(intj=0;j<m;j++)
{
if(3==j)
{
breakloop;//--loop為標(biāo)簽只能用在循環(huán)語(yǔ)句中,用于循環(huán)跳到外層循環(huán)
}
}
}
辨析:
intx,a=6,b=7;x=a+++b++;//----------a=7,b=8,x=13
intx=6;x=~x;//----------------6的二進(jìn)制0110取反得11001再轉(zhuǎn)成補(bǔ)碼〔取反加一〕10111=-7break,跳出本層循環(huán),執(zhí)行后面的代碼,continue,提前終止本次循環(huán),再一次進(jìn)展循環(huán)或循環(huán)條件滿足或不滿足后退出循環(huán)。break標(biāo)簽名;continue標(biāo)簽名;這兩條語(yǔ)句知識(shí)表示跳出有標(biāo)簽的循環(huán)和提前終止本次有標(biāo)簽的循環(huán),只能用在循環(huán)語(yǔ)句〔多層循環(huán)嵌套〕中,循環(huán)嵌套中用于跳到外層循環(huán)。注意:for循環(huán)在使用時(shí)一定要注意不要忘記()中的兩個(gè)";",死循環(huán)的寫法for(;;){}或者是用
while(true){}
注意:System.out.println("..."+a)在使用這個(gè)語(yǔ)句時(shí),它會(huì)將其中非字符串〔String〕的值轉(zhuǎn)換成字符串〔不是所有數(shù)據(jù)類型都可以的〕。java中的數(shù)組Array,其包含兩個(gè)局部,分別是數(shù)組的引用和數(shù)組的空間兩局部。聲明數(shù)組1)一組一樣類型(可以是類)數(shù)據(jù)的集合;2)一個(gè)數(shù)組是一個(gè)對(duì)象;3)聲明一個(gè)數(shù)組沒(méi)有創(chuàng)立一個(gè)對(duì)象;4)數(shù)組能以以下形式聲明:int[]i或inti[]Car[]c或Carc[]*C++中只能Carc[]*JAVA中推薦用Car[]c;5)數(shù)組的定義如:int[]a〔數(shù)組引用聲明〕=newint[10]〔數(shù)組空間的聲明,并把空間首地址賦值給數(shù)組的引用〕int[]a;a=newint[20];創(chuàng)立數(shù)組1)創(chuàng)立基本數(shù)據(jù)類型數(shù)組int[]i=newint[2];2)創(chuàng)立引用數(shù)據(jù)類型數(shù)組Car[]c=newCar[100];3)數(shù)組創(chuàng)立后有初始值。數(shù)字類型為0布爾類型為false引用類型為null注意:訪問(wèn)沒(méi)有初始化的數(shù)組中的值,是會(huì)拋出異常的〔NullPointerException〕,java中只保證一位數(shù)組的地址是連續(xù)的,二維數(shù)組實(shí)際上是一維數(shù)組中有存儲(chǔ)了一維數(shù)組的引用。初始化數(shù)組1)初始化、創(chuàng)立、和聲明分開int[]i;i=newint[2];i[0]=0;i[1]=1;2〕初始化、創(chuàng)立、和聲明在同一時(shí)間int[]i={0,1};Car[]c={newCar(),newCar()};多維數(shù)組1〕有效定義int[][]i1=newint[2][3];〔同時(shí)給定一維,二維的空間〕int[][]i2=newint[2][];〔給定一維的空間,二維空間待定〕i2[0]=newint[2],i2[1]=newint[3];*C++中int[][]=newint[][3];有效2〕無(wú)效定義int[][]i1=newint[][3];3〕數(shù)組長(zhǎng)度------------數(shù)組的屬性length〔在二維數(shù)組中這個(gè)屬性只代表第一維的長(zhǎng)度〕int[]i=newint[5];intlen=i.length;//len=5;Student[][]st=newStudent[4][6];len=st.length;//len=4;len=st[0].length;//len=6;數(shù)組拷貝
System.arrayCopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength);src源數(shù)組,srcPos從第幾位開場(chǎng)拷貝,dest目標(biāo)數(shù)組,destPos目標(biāo)數(shù)組放置的起始位置,length,表示要拷貝的長(zhǎng)度??截愐粋€(gè)數(shù)組到另一個(gè)數(shù)組。類的對(duì)象的創(chuàng)立和對(duì)象數(shù)組一個(gè)xxx.Java文件中可以定義多個(gè)類但是只能由一個(gè)public修飾的類,也只能以這個(gè)類的類名作為.java的文件名。java中的類的對(duì)象的創(chuàng)立,要先創(chuàng)立這個(gè)對(duì)象的引用,例如:Carc;然后用new這個(gè)關(guān)鍵字創(chuàng)立一個(gè)對(duì)象的實(shí)例〔對(duì)象的空間〕例如:c=newCar();,然后對(duì)象的實(shí)例的空間首地址賦值給對(duì)象的引用。多個(gè)對(duì)象的引用可以同時(shí)引用自同一個(gè)對(duì)象的實(shí)例,但是對(duì)象的引用只能引用一個(gè)對(duì)象的實(shí)例。對(duì)象的引用和對(duì)象的實(shí)例間就像是牽著氣球的線和氣球一樣。注意:只有一個(gè)沒(méi)有被任何對(duì)象的引用所引用的對(duì)象的實(shí)例才會(huì)邊城垃圾等待被垃圾回收。對(duì)象數(shù)組例:Car[]c=newCar[3];c[0]=newCar();注意:存放基本類型的數(shù)組的數(shù)據(jù)是直接存放在數(shù)組的空間中,而對(duì)象的數(shù)組在數(shù)組空間中存放的則是對(duì)象的引用。定義在類中類的屬性是實(shí)例變量,定義在類的方法中的變量是局部變量。實(shí)例變量是保存在對(duì)象空間中的,而局部變量則是在方法調(diào)用的分配空間,調(diào)用完畢后就釋放空間。注意:在類的定義中屬性的定義和方法的定義必須寫在類里。注意:系統(tǒng)會(huì)自動(dòng)初始化實(shí)例變量,數(shù)字類型為0,布爾類型為false,引用類型為null。局部變量需要初始化,必須賦初值。如果不賦初值無(wú)法通過(guò)編譯。Java中的方法調(diào)用中參數(shù)傳遞有兩種,一個(gè)是對(duì)于參數(shù)是基本類型的使用的是值傳遞〔直接傳參數(shù)的值〕,另一個(gè)是引用傳遞,它是用于參數(shù)是類的對(duì)象,它傳遞的是這個(gè)對(duì)象的引用。面向?qū)ο蟮乃枷?/p>
anythingisObject〔萬(wàn)物皆對(duì)象〕抽象,從對(duì)具體的對(duì)象中抽取有用信息。對(duì)象有其固有屬性,對(duì)象的方法,即對(duì)象的行為〔對(duì)象能做什么〕對(duì)象本身是簡(jiǎn)單的〔功能簡(jiǎn)單〕,多個(gè)對(duì)象可以組成復(fù)雜的系統(tǒng)〔對(duì)象之間彼此調(diào)用對(duì)方的方法〕對(duì)象應(yīng)當(dāng)是各司其職〔功能簡(jiǎn)單〕,各盡所能〔把自己的功能作到最好〕?!踩躐詈闲詫?shí)現(xiàn)了前面所述的對(duì)象的特點(diǎn)〕對(duì)象的耦合性,是對(duì)象之間的聯(lián)系,對(duì)象和系統(tǒng)之間的聯(lián)系。對(duì)象的耦合性要盡量的弱,也就是對(duì)象之間的聯(lián)系盡可能的弱,對(duì)象和系統(tǒng)之間的聯(lián)系盡可能的弱。系統(tǒng)的可插入性,是在系統(tǒng)中參加新的對(duì)象之后的系統(tǒng)穩(wěn)定性。對(duì)象的可替換性,是在系統(tǒng)中替換原有的對(duì)象之后的系統(tǒng)的穩(wěn)定性。復(fù)用性,即對(duì)象可否被重復(fù)使用,對(duì)象的功能越簡(jiǎn)單,復(fù)用性就越好?!矊?duì)象的耦合性弱,復(fù)用性就比較強(qiáng)〕面向過(guò)程是先有算法,后又?jǐn)?shù)據(jù)構(gòu)造〔怎么解決問(wèn)題〕面向?qū)ο笫窍扔袑?duì)象〔數(shù)據(jù)構(gòu)造〕,后有算法?!灿檬裁醋觥愁愂悄承┯兄粯訉傩缘募系某橄?。類是一個(gè)類對(duì)象的模板,對(duì)象是類的具體化。類是一個(gè)新的數(shù)據(jù)類型,類的對(duì)象。注意:局部變量的作用范圍是在定義他的代碼塊以內(nèi),局部變量要先賦值后使用,在以一個(gè)重合的作用于范圍內(nèi)不允許兩個(gè)局部變量命名沖突。局部變量局部?jī)?yōu)先,且在于實(shí)例變量同名時(shí)會(huì)副該局部變量。變量包括簡(jiǎn)單變量〔原始數(shù)據(jù)類型〕,對(duì)象變量。方法的定義:1,方法的修飾符〔多個(gè)修飾符出現(xiàn)的順序無(wú)關(guān)〕|2,方法的返回值類型|順3,方法名|序4,方法的參數(shù)表|向5,方法中允許拋出的異常|下java中不能夠在返回語(yǔ)句后寫任何代碼。JVM+解釋器=JRE,JRE+類庫(kù)=JDKjava中方法的重載〔overload〕方法名一樣,參數(shù)表不同,返回值類型可以不同。調(diào)用時(shí)要給出明確參數(shù)并確定調(diào)用某一方法。在編譯時(shí),編譯器會(huì)根據(jù)參數(shù)選擇適當(dāng)?shù)姆椒ǎ灾剌d也叫編譯時(shí)多態(tài)。就近向上匹配原則如果方法的參數(shù)表中的數(shù)據(jù)類型和調(diào)用時(shí)給出的參數(shù)類型不盡一樣時(shí)會(huì)根據(jù)向上匹配的就近原則?!差愋途徒蛏限D(zhuǎn)化匹配〕注意:調(diào)用時(shí)要給出明確參數(shù)并確定調(diào)用某一方法,否則編譯會(huì)出錯(cuò)。對(duì)象使用者〔調(diào)用其他對(duì)象的方法〕對(duì)象〔對(duì)象中的方法被調(diào)用時(shí)根據(jù)參數(shù)進(jìn)展自己進(jìn)展選擇〕一類方法,但跟據(jù)不同的參數(shù)會(huì)有差異,對(duì)象回根據(jù)參數(shù)判斷,對(duì)對(duì)象調(diào)用者透明。創(chuàng)立對(duì)象的過(guò)程:1,分配空間2,初始化屬性3,調(diào)用構(gòu)造方法〔有前提,不考慮繼承關(guān)系〕構(gòu)造方法的寫法:沒(méi)有返回值類型,構(gòu)造方法的方法命名必須和類名一樣。如果在類中不寫構(gòu)造方法,系統(tǒng)會(huì)提供一個(gè)無(wú)參的構(gòu)造方法。注意:最好在寫類時(shí)提供一個(gè)無(wú)參的構(gòu)造方法。獲得對(duì)象的方式通過(guò)new〔在堆空間中申請(qǐng)分配空間〕,new類名〔〕,可以通過(guò)這種形式或的一個(gè)對(duì)象,這時(shí)的對(duì)象是無(wú)法使用,必須把的他的地址存放近一個(gè)對(duì)象變量才能夠使用。例如:Carc=newCar();有參的構(gòu)造方法在被調(diào)用時(shí),在用new關(guān)鍵字或的對(duì)象時(shí)初始化,例如:Carc=newCar("yellow")
對(duì)象變量中存放的是對(duì)象的引用〔地址的封裝形式〕this關(guān)鍵字表示當(dāng)前對(duì)象〔哪個(gè)對(duì)象調(diào)用了方法,哪個(gè)對(duì)象就是當(dāng)前對(duì)象〕,可以用來(lái)區(qū)分實(shí)例變量和局部變量。this(),他表示掉用本類其他的構(gòu)造方法,注,只能寫在構(gòu)造方法的第一行。java中的參數(shù)傳遞,簡(jiǎn)單類型的變量傳遞的是數(shù)值,對(duì)象變量的傳遞則傳遞的一個(gè)引用〔地址〕面向?qū)ο蟮娜筇卣鞣庋b、繼承、多態(tài)。java中的封裝封裝,一個(gè)對(duì)象和外界的聯(lián)系應(yīng)當(dāng)通過(guò)一個(gè)統(tǒng)一的接口,應(yīng)當(dāng)公開的公開,應(yīng)當(dāng)隱藏的隱藏。〔對(duì)象的屬性應(yīng)當(dāng)隱藏〕,一個(gè)對(duì)象的內(nèi)部是透明的,就是把對(duì)象內(nèi)部的可透明性和隱藏的特性區(qū)分開,該透明的透明,該隱藏的隱藏。〔封裝的屬性〕java中類的屬性的訪問(wèn)權(quán)限的默認(rèn)值不是private,要想隱藏該屬性或方法,就可以加private〔私有〕修飾符,來(lái)限制只能夠在類的內(nèi)部進(jìn)展訪問(wèn)。對(duì)于類中的私有屬性,要對(duì)其給出一對(duì)方法〔getXxx(),setXxx()〕訪問(wèn)私有屬性,保證對(duì)私有屬性的操作的安全性。方法的封裝對(duì)于方法的封裝,該公開的公開,該隱藏的隱藏。方法公開的是方法的聲明〔定義〕,即〔只須知道參數(shù)和返回值就可以調(diào)用該方法〕,隱藏方法的實(shí)現(xiàn)會(huì)使實(shí)現(xiàn)的改變對(duì)架構(gòu)的影響最小化。。封裝會(huì)使方法實(shí)現(xiàn)的改變對(duì)架構(gòu)的影響最小化。完全的封裝,類的屬性全部私有化,并且提供一對(duì)方法來(lái)訪問(wèn)屬性。java中的繼承繼承,是對(duì)有著共同特性的多類事物,進(jìn)展再抽象成一個(gè)類。這個(gè)類就是多類事物的父類。父類的意義在于可以抽取多類事物的共性。java中的繼承要使用extends關(guān)鍵字,并且java中只允許單繼承,也就是一個(gè)類只能有一個(gè)父類。這樣就是繼承關(guān)系呈樹狀,表達(dá)了java的簡(jiǎn)單性。子類只能繼承在父類中可以訪問(wèn)的屬性和方法〔實(shí)際上父類中私有的屬性和方法也會(huì)被繼承但子類中無(wú)法訪問(wèn)罷了〕。訪問(wèn)控制修飾符〔可以修飾屬性和方法〕private修飾符,表示只有本類內(nèi)部可以訪問(wèn)。default修飾符,方法不加修飾符,會(huì)默認(rèn)為default,表示在同一個(gè)包中可以訪問(wèn),父子類在同一包中,子類可以繼承父類的相應(yīng)內(nèi)容?!部梢孕揎楊悺硃rotected〔保護(hù)〕修飾符,表示同一包中可以訪問(wèn),不同包的子類也可以訪問(wèn)繼承。public修飾符,表示公開,在任何地方都可以訪問(wèn)?!部梢孕揎楊悺承揎椃臋?quán)限是由上而下逐漸變寬的。繼承的意義在于子類可以在父類的基礎(chǔ)之上對(duì)父類的功能進(jìn)展開展,繼承可以使系統(tǒng)的耦合性降低,也就是使對(duì)象間的聯(lián)系便的松散,使多類對(duì)象間的聯(lián)系用其父類對(duì)象代替。注意:構(gòu)造方法不能被繼承。父類的屬性及方法確實(shí)定要從子類的角度來(lái)看子類間的共性,當(dāng)所有子類都有這個(gè)屬性時(shí),就應(yīng)當(dāng)考慮是否該放在父類中,方法也是如此,方法可以被看作是對(duì)象的行為,而類的方法這時(shí)這一類對(duì)象所共有的行為,所以也應(yīng)當(dāng)在方法確實(shí)定時(shí)注意是不是所有的子類型中都需要有這種方法,并且會(huì)根據(jù)不同的類型的行為的方式也不同才可以覆蓋著個(gè)方法。java中方法的覆蓋子類中有和父類中可訪問(wèn)〔可繼承到子類〕的同名同返回類型同參數(shù)表的方法,就會(huì)覆蓋從父類繼承來(lái)的方法。注意:在jdk1.4以前要求方法的覆蓋時(shí),需要方法的返回值,參數(shù)表,方法名必須嚴(yán)格一樣,而在jdk1.5中方法覆蓋,子類的中覆蓋的方法的返回值可以是父類中被覆蓋的方法的返回值類型的子類型。注意:子類的方法覆蓋父類的方法時(shí),方法的修飾符要么一樣,要么子類中的方法的修飾符表示的訪問(wèn)權(quán)限要寬于父類。父類中的私有方法,不能被繼承到子類,就是說(shuō)子類中即使將其覆蓋了也不會(huì)有多態(tài)。覆蓋的意義:對(duì)從父類中繼承的方法的開展。注意:父子類中有同名的屬性不叫子類覆蓋父類的屬性,叫做屬性的遮蓋〔shadow〕。當(dāng)構(gòu)造有繼承關(guān)系的對(duì)象的步驟1,遞歸的構(gòu)造父類的對(duì)象2,分配空間3,初始化本類實(shí)例變量〔屬性〕4,調(diào)用本類的構(gòu)造方法注意:子類對(duì)象中其實(shí)包含著父類的對(duì)象,也就是父類對(duì)象加上子類對(duì)象,才是完整的子類對(duì)象的實(shí)例。super關(guān)鍵字super(),表示在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法〔可以通過(guò)這種方法在子類的構(gòu)造方法中初始化父類中的屬性〕,super()也只能出現(xiàn)在構(gòu)造方法的第一句上.super(),在子類的構(gòu)造方中指明構(gòu)造父類時(shí)調(diào)用哪一個(gè)父類的構(gòu)造方法構(gòu)造父類。super,這里所表示的是一個(gè)父類的對(duì)象,可以通過(guò)super來(lái)使用父類中可以訪問(wèn)的方法〔可以在父類中定義setXxx(),getXxx()方法來(lái)訪問(wèn)父類中的私有屬性〕,super可以屏蔽父子類中同名屬性的沖突。注意:在寫類的時(shí)候,一定要寫默認(rèn)無(wú)參的構(gòu)造方法,如果一個(gè)構(gòu)造方法的第一句既不是this(),也不是super()時(shí),那么就會(huì)在這里隱含的調(diào)用他的父類的無(wú)參的構(gòu)造方法,即隱含的有super()。少覆蓋原則:既子類應(yīng)當(dāng)盡量少的覆蓋父類方法,如果覆蓋了父類的大多數(shù)方法,那就應(yīng)當(dāng)考慮是否應(yīng)當(dāng)有繼承關(guān)系java中的多態(tài)〔以子類覆蓋了父類的方法為前提〕多態(tài),把子類對(duì)象主觀的看作是其父類型的對(duì)象,那么父類型就可以是很多種類型。多態(tài),編譯時(shí)多態(tài)〔方法的重載〕運(yùn)行時(shí)多態(tài)〔多態(tài)〕編譯時(shí)類型,也就是可以被看作的類型,主觀認(rèn)定。運(yùn)行時(shí)類型,也就是實(shí)際的對(duì)象實(shí)例的類型,客觀不可改變〔也是被看作類型的子類型〕對(duì)于一個(gè)對(duì)象來(lái)說(shuō),在對(duì)象產(chǎn)生時(shí),運(yùn)行時(shí)類型就已經(jīng)確定不會(huì)再改變,編譯時(shí)類型可以和運(yùn)行時(shí)類型不同。在對(duì)象變量聲明時(shí)可以確定其運(yùn)行時(shí)類型,但是編譯時(shí)類型對(duì)象變量背后所指向運(yùn)行時(shí)類型則可以是其本類型或者是其子類型。多態(tài)三特性1,對(duì)象實(shí)例確定則不可改變〔客觀不可改變〕2,只能調(diào)用編譯時(shí)類型所定義的方法。3,運(yùn)行時(shí)會(huì)根據(jù)運(yùn)行時(shí)類型去調(diào)用相應(yīng)類型中定義的方法。多態(tài)的意義:在需要使用一類對(duì)象的共性時(shí),可以用多來(lái)屏蔽掉其子類中的差異。注意:類的屬性是沒(méi)有多態(tài)的,只會(huì)根據(jù)編譯時(shí)類型訪問(wèn)。只有子類覆蓋了父類的方法,且把子類對(duì)象黨作父類類型來(lái)看時(shí)才會(huì)有多態(tài)。要注意區(qū)分子類中的方法重載。對(duì)于方法的重載,則是會(huì)使用編譯時(shí)類型來(lái)進(jìn)展相應(yīng)的方法調(diào)用。兩種復(fù)用1,白箱復(fù)用,也就是繼承復(fù)用,父類中的可以被子類訪問(wèn)到的就可以被繼承,這樣會(huì)有些不需要的內(nèi)容被繼承下來(lái),所以這種方式不太好。2,黑箱復(fù)用,也叫組合復(fù)用,也就是把要復(fù)用代碼的類的對(duì)象作為本類中的一個(gè)屬性,然后再通過(guò)方法的委托來(lái)實(shí)現(xiàn)由選擇的復(fù)用,方法的委托就是在本類的方法內(nèi)部通過(guò)該類的對(duì)象調(diào)用要使用類的方法。注意:盡量用組合復(fù)用替代繼承復(fù)用。多態(tài)的使用多態(tài)用于參數(shù),可以在方法的參數(shù)中傳入其父類類型,在運(yùn)行時(shí)會(huì)根據(jù)實(shí)際的運(yùn)行時(shí)類型來(lái)在方法中進(jìn)展相應(yīng)的操作。多態(tài)用于返回值,可以在方法的返回值類型上是用其實(shí)際返回值的父類型,在使用期返回值時(shí)也不比關(guān)心其實(shí)際類型。多態(tài)可以使代碼變得更通用,以適應(yīng)需求的變化。也就是定義在父類中的方法,可以在子類中有不同的實(shí)現(xiàn)將其覆蓋,在為父類型的對(duì)象變量賦值相應(yīng)需要功能的子類的對(duì)象實(shí)例。java中的修飾符
static表示靜態(tài),它可以修飾屬性,方法和代碼塊。1,static修飾屬性〔類變量〕,那么這個(gè)屬性就可以用類名.屬性名來(lái)訪問(wèn),也就是使這個(gè)屬性成為本類的類變量,為本類對(duì)象所共有。這個(gè)屬性就是全類公有?!补灿械念愖兞颗c對(duì)象無(wú)關(guān),只和類有關(guān)〕。類加載的過(guò)程,類本身也是保存在文件中〔字節(jié)碼文件保存著類的信息〕的,java會(huì)通過(guò)I/O流把類的文件〔字節(jié)碼文件〕讀入JVM〔java虛擬機(jī)〕,這個(gè)過(guò)程成為類的加載.JVM〔java虛擬機(jī)〕會(huì)通過(guò)類路徑〔CLASSPATH〕來(lái)找字節(jié)碼文件。類變量,會(huì)在加載時(shí)自動(dòng)初始化,初始化規(guī)則和實(shí)例變量一樣。注意:類中的實(shí)例變量是在創(chuàng)立對(duì)象時(shí)被初始化的,被static修飾的屬性,也就是類變量,是在類加載時(shí)被創(chuàng)立并進(jìn)展初始化,類加載的過(guò)程是進(jìn)展一次。也就是類變量只會(huì)被創(chuàng)立一次。2,static修飾方法〔靜態(tài)方法〕,會(huì)使這個(gè)方法成為整個(gè)類所公有的方法,可以用類名。方法名訪問(wèn)。注意:static修飾的方法,不直接能訪問(wèn)〔可以通過(guò)組合方式訪問(wèn)〕本類中的非靜態(tài)(static)成員〔包括方法和屬性〕,本類的非靜態(tài)〔static〕方法可以訪問(wèn)本類的靜態(tài)成員〔包括方法和屬性〕,可以調(diào)用靜態(tài)方法。靜態(tài)方法要慎重使用。在靜態(tài)方法中不能出現(xiàn)this關(guān)鍵字。注意:父類中是靜態(tài)方法,子類中不能覆蓋為非靜態(tài)方法,在符合覆蓋規(guī)則的前提下,在父子類中,父類中的靜態(tài)方法可以被子類中的靜態(tài)方法覆蓋,但是沒(méi)有多態(tài)?!苍谑褂脤?duì)象調(diào)用靜態(tài)方法時(shí)其實(shí)是調(diào)用編譯時(shí)類型的靜態(tài)方法〕注意:父子類中,靜態(tài)方法只能被靜態(tài)方法覆蓋,非靜態(tài)方法只能被非靜態(tài)方法覆蓋。java中的main方法必須寫成static是因?yàn)樵陬惣虞d時(shí)無(wú)法創(chuàng)立對(duì)象,因?yàn)殪o態(tài)方法可以不通過(guò)對(duì)象調(diào)用,所以在類的main方法所在類加載時(shí)就可以通過(guò)main方法入口來(lái)運(yùn)行程序。注意:組合方式,就是需要在方法中創(chuàng)立一個(gè)所需要的對(duì)象,并用這個(gè)對(duì)象來(lái)調(diào)用任意所需的該對(duì)象的內(nèi)容,不會(huì)再受只能訪問(wèn)靜態(tài)的約束。3,static修飾初始代碼塊,這時(shí)這個(gè)初始代碼塊就叫做靜態(tài)初始代碼塊,這個(gè)代碼塊只在類加載時(shí)被執(zhí)行一次??梢杂渺o態(tài)初始代碼塊初始化一個(gè)類。動(dòng)態(tài)初始代碼塊,寫在類體中的“{}〞,這個(gè)代碼塊是在生成對(duì)象的初始化屬性是運(yùn)行。這種代碼塊叫動(dòng)態(tài)初始代碼塊。類在什么時(shí)候會(huì)被加載,構(gòu)造〔創(chuàng)立〕對(duì)象時(shí)會(huì)加載類,調(diào)用類中靜態(tài)方法或訪問(wèn)靜態(tài)屬性也是會(huì)加載這個(gè)靜態(tài)方法真正所在的類。在構(gòu)造子類對(duì)象時(shí)必會(huì)先加載父類,類加載會(huì)有延遲加載原則,只有在必須加載時(shí)才會(huì)加載。final修飾符,可以修飾變量,方法,類1,final修飾變量被fianl修飾的變量就會(huì)變成常量〔常量應(yīng)當(dāng)大寫〕,一旦賦值不能改變,〔可以在初始化時(shí)直接賦值,也可以在構(gòu)造方法里也可以賦值,只能在這兩種方法里二選一,不能不為常量賦值〕,fianl的常量不會(huì)有默認(rèn)初始值,對(duì)于直接在初始化是賦值時(shí)final修飾符常和static修飾符一起使用。2,final修飾方法,被final修飾的方法將不能被其子類覆蓋,保持方法的穩(wěn)定不能被覆蓋。3,final修飾類,被final修飾的類將不能被繼承。final類中的方法也都是final的。注意:final,不能用來(lái)修飾構(gòu)造方法,在父類中如果有常量屬性,在子類中使用常量屬性時(shí)是不會(huì)進(jìn)展父類的類加載。靜態(tài)常量如果其值可以確定,就不會(huì)加載該類,如果不能確定則會(huì)加載該常量所在的類。不變模式:對(duì)象一旦創(chuàng)立屬性就不會(huì)改變。用final修飾屬性,也用final修飾類〔強(qiáng)不變模式〕,用final修飾屬性〔弱不變模式〕。不變模式的典型表達(dá):java.lang.String類,不變模式可以實(shí)現(xiàn)對(duì)象的共享〔可以用一個(gè)對(duì)象實(shí)例賦值給多個(gè)對(duì)象變量?!吵鼗乃枷?,把需要共享的數(shù)據(jù)放在池中〔節(jié)省空間,共享數(shù)據(jù)〕只有String類可以用“〞中的字面值創(chuàng)立對(duì)象。在String類中,以字面值創(chuàng)立時(shí),會(huì)到Java方法空間的串池空間中去查找,如果有就返回串池中字符串的地址,并把這個(gè)地址付給對(duì)象變量。如果沒(méi)有則會(huì)在串池里創(chuàng)立一個(gè)字符串對(duì)象,并返回其地址付購(gòu)對(duì)象變量,當(dāng)另一個(gè)以字面值創(chuàng)立對(duì)象時(shí)則會(huì)重復(fù)上述過(guò)程。如果是new在堆空間中創(chuàng)立String類的對(duì)象,則不會(huì)有上述的過(guò)程。String類中的intern()方法會(huì)將在堆空間中創(chuàng)立的String類對(duì)象中的字符串和串池中的比對(duì),如果有一樣的串就返回這個(gè)串的串池中的地址。不變模式在對(duì)于對(duì)象進(jìn)展修改,添加操作是使相當(dāng)麻煩的,他會(huì)產(chǎn)生很多的中間垃圾對(duì)象。創(chuàng)立和銷毀的資源的開銷是相當(dāng)大的。String類在字符串連接時(shí)會(huì)先的效率很低,就是因?yàn)樗a(chǎn)生的對(duì)象的書性是不能夠修改的,當(dāng)連接字符串時(shí)也就是只能創(chuàng)立新的對(duì)象。對(duì)于很多的字符串連接,應(yīng)當(dāng)使用StringBuffer類,在使用這個(gè)類的對(duì)象來(lái)進(jìn)展字符串連接時(shí)就不會(huì)有多余的中間對(duì)象生成,從而優(yōu)化了效率。abstract〔抽象〕修飾符,可以修飾類和方法1,abstract修飾類,會(huì)使這個(gè)類成為一個(gè)抽象類,這個(gè)類將不能生成對(duì)象實(shí)例,但可以做為對(duì)象變量聲明的類型,也就是編譯時(shí)類型,抽象類就像當(dāng)于一類的半成品,需要子類繼承并覆蓋其中的抽象方法。2,abstract修飾方法,會(huì)使這個(gè)方法變成抽象方法,也就是只有聲明〔定義〕而沒(méi)有實(shí)現(xiàn),實(shí)現(xiàn)局部以";"代替。需要子類繼承實(shí)現(xiàn)〔覆蓋〕。注意:有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。abstract修飾符在修飾類時(shí)必須放在類名前。abstract修飾方法就是要求其子類覆蓋〔實(shí)現(xiàn)〕這個(gè)方法。調(diào)用時(shí)可以以多態(tài)方式調(diào)用子類覆蓋〔實(shí)現(xiàn)〕后的方法,也就是說(shuō)抽象方法必須在其子類中實(shí)現(xiàn),除非子類本身也是抽象類。注意:父類是抽象類,其中有抽象方法,那么子類繼承父類,并把父類中的所有抽象方法都實(shí)現(xiàn)〔覆蓋〕了,子類才有創(chuàng)立對(duì)象的實(shí)例的能力,否則子類也必須是抽象類。抽象類中可以有構(gòu)造方法,是子類在構(gòu)造子類對(duì)象時(shí)需要調(diào)用的父類〔抽象類〕的構(gòu)造方法。final和abstract,private和abstract,static和abstract,這些是不能放在一起的修飾符,因?yàn)閍bstract修飾的方法是必須在其子類中實(shí)現(xiàn)〔覆蓋〕,才能以多態(tài)方式調(diào)用,以上修飾符在修飾方法時(shí)期子類都覆蓋不了這個(gè)方法,final是不可以覆蓋,private是不能夠繼承到子類,所以也就不能覆蓋,static是可以覆蓋的,但是在調(diào)用時(shí)會(huì)調(diào)用編譯時(shí)類型的方法,因?yàn)檎{(diào)用的是父類的方法,而父類的方法又是抽象的方法,又不能夠調(diào)用,所以上的修飾符不能放在一起。抽象〔abstract〕方法代表了某種標(biāo)準(zhǔn),定義標(biāo)準(zhǔn),定義功能,在子類中去實(shí)現(xiàn)功能〔子類繼承了父類并需要給出從父類繼承的抽象方法的實(shí)現(xiàn)〕。方法一時(shí)間想不到怎么被實(shí)現(xiàn),或有意要子類去實(shí)現(xiàn)而定義某種標(biāo)準(zhǔn),這個(gè)方法可以被定義為抽象。(abstract)模板方法模式:用abstract把制訂標(biāo)準(zhǔn)和實(shí)現(xiàn)標(biāo)準(zhǔn)分開,制定的標(biāo)準(zhǔn)就是模板,實(shí)現(xiàn)就是按模板標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),也就是繼承模板,實(shí)現(xiàn)模板中相應(yīng)功能的方法。模板中不允許修改的方法可以用fianl來(lái)修飾,這個(gè)方法不能使抽象方法,為保證安全,封裝,把模板中不公開的局部用protected〔保護(hù)〕修飾。Java中的接口接口是一種程序構(gòu)造,是特殊的抽象類。接口中的方法必須都是公開的抽象方法〔publicabstract〕,接口中的屬性都是公開靜態(tài)常量〔publicstaticfinal〕。聲明一個(gè)接口用 interface 關(guān)鍵字,接口也是一種類型,編譯之后也有生成相應(yīng)字節(jié)碼,他的聲明標(biāo)準(zhǔn)也要符合類型的定義(一個(gè)源文件中只能有一個(gè)publicinterface,接口名和源文件名一樣,有publicinterface,就不能在寫publicclass了)。接口中的屬性可以不加修飾符,方法也不用加修飾符。接口也可以繼承,但是只能由接口繼承,在用類去繼承時(shí)要換用implements關(guān)鍵字,這時(shí)類和接口也不叫做繼承關(guān)系,而是實(shí)現(xiàn)關(guān)系,但其實(shí)質(zhì)也是繼承。一個(gè)類可以繼承也只能繼承另外一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口,其語(yǔ)法是在implements后面寫接口名,多個(gè)接口以“,〞分隔。接口之間是可以多繼承的,其語(yǔ)法和類的繼承語(yǔ)法是一樣的,在接口多繼承時(shí),在extends后寫接口名如果要繼承多個(gè)接口,接口名以“,〞分隔,接口的繼承關(guān)系只是把其父接口中的抽象方法繼承到子接口中。要實(shí)現(xiàn)接口就必須實(shí)現(xiàn)接口中的所有方法。一個(gè)類可以在繼承一個(gè)類的同時(shí),也可以實(shí)現(xiàn)一個(gè)或多個(gè)接口。采用接口就繞開了單繼承限制。接口類型也可以做為編譯時(shí)類型使用,但其實(shí)際的運(yùn)行時(shí)類型必須是完全實(shí)現(xiàn)接口的類的對(duì)象實(shí)例,這樣就使多態(tài)變得很靈活了,注意:實(shí)現(xiàn)接口時(shí),在實(shí)現(xiàn)(覆蓋)抽象方法時(shí),注意必須要在方法的返回值類型前加public修飾符。如果沒(méi)有完全實(shí)現(xiàn)接口中的方法,那么這個(gè)類就只能夠是個(gè)抽象類,不能創(chuàng)立對(duì)象。接口的是實(shí)質(zhì)就是特殊的抽象類。接口沒(méi)有構(gòu)造方法。接口的意義:1,接口可以實(shí)現(xiàn)多繼承。2,用接口可以實(shí)現(xiàn)混合類型〔主類型,副類型〕,java中可以通過(guò)接口分出主次類型。主類型使用繼承,副類型,使用接口實(shí)現(xiàn)。3,接口進(jìn)一步深化了標(biāo)準(zhǔn)的思想,接口本身就是一個(gè)標(biāo)準(zhǔn),他起到了降低耦合性的作用,接口可以使方法的定義和實(shí)現(xiàn)相別離,也就是將接口的定義者和實(shí)現(xiàn)者相別離,接口也可以用于降低模塊間或系統(tǒng)間的耦合性。針對(duì)接口編程可以屏蔽不同實(shí)現(xiàn)間的差異,看到的只是實(shí)現(xiàn)好的功能,接口:定義標(biāo)準(zhǔn),接口的實(shí)現(xiàn):實(shí)現(xiàn)標(biāo)準(zhǔn)接口的調(diào)用者:標(biāo)準(zhǔn)的使用針對(duì)接口編程原則,也就是按照標(biāo)準(zhǔn)實(shí)現(xiàn)。接口的回調(diào):先有接口的定義〔接口實(shí)現(xiàn)者〕,再有接口使用者,最后把接口的實(shí)現(xiàn)對(duì)象傳入接口的使用者中,接口的使用者會(huì)通過(guò)接口來(lái)調(diào)用接口實(shí)現(xiàn)者的方法。接口的回調(diào):接口的定義者定義好了標(biāo)準(zhǔn),接口的使用者先寫好了使用代碼,接口的實(shí)現(xiàn)者寫好實(shí)現(xiàn)之后把實(shí)現(xiàn)對(duì)象傳入接口的使用者中。他調(diào)用接口中方法也就是掉用接口實(shí)現(xiàn)中的方法。這種過(guò)程叫做接口的回調(diào)。盡量使用接口類型作為編譯時(shí)類型,盡量將抽取到的共性行為寫在接口中。用假設(shè)干個(gè)小接口取代一個(gè)大接口?!步涌诟綦x原則〕把一個(gè)類的功能作成接口,只暴露想暴露的方法,接口隔離原則可以實(shí)現(xiàn)更高層次的封裝,針對(duì)的對(duì)象不同,暴露的方法也不同。java中的根類Objectjava中所有的類的父類或直接或間接的或隱含的都是Object類。java不允許循環(huán)繼承,也就是互相繼承是不可以的。Object類中的finalize()一個(gè)對(duì)象被垃圾收集的時(shí)候,最后會(huì)由JVM調(diào)用這個(gè)對(duì)象的finalize方法Object類中有一個(gè)StringtoString()方法,返回該對(duì)象的字符串表示。Object類中的toString()方法他返回的是類名加上他的地址的一個(gè)字符串。在子類中推薦覆蓋toString()方法。Object類中的booleanequals(Objecto)方法是用來(lái)比較對(duì)象的內(nèi)容是否相等,其返回值是boolean類型的值,一樣為真,不同則為假。實(shí)際上還是比較對(duì)象地址是否一樣。String類覆蓋了equals()方法,他比較是對(duì)象中的內(nèi)容是否一樣。子類中也推薦覆蓋Object類中繼承的equals()方法equals()的覆蓋原則:自反性:x.equals(x)為true對(duì)稱性:y.equals(x)和x.equals(y)的值要一樣,要么都為true,要么都為false。傳遞性:x.equals(y)為true,y.equals(z)也為true,那么x.equals(z)一定也為true。覆蓋equals()方法的步驟:
booleanequals(Objecto)
{
if(this==o)returntrue;//1,看看是不是一個(gè)對(duì)象
if(o==null)returntrue;//2,看看對(duì)象是不是空if(!(oinstanceof本類類名))returnfalse;//看看是不是本類對(duì)象......//根據(jù)本類設(shè)計(jì)。
}
封裝類java為每一個(gè)簡(jiǎn)單數(shù)據(jù)類型提供了一個(gè)封裝類,使每個(gè)簡(jiǎn)單數(shù)據(jù)類型可以被Object來(lái)裝載。除了int〔Integer〕和char〔Character〕,其余類型首字母大寫即成封裝類類型名。轉(zhuǎn)換字符的方式:
intI=10;
Strings=I+〞〞;Strings1=String.valueOf(i);
IntI=10;IntergerI_class=newinteger(I);封裝類、字符串、基本類型間的轉(zhuǎn)換
Interger--------------------(Double(x.toString))------------>Double
String-----------------(Integer.valueOf())---------------->Integer
Integer-----------------(x.toString())--------------------->String
int----------------------(100+〞〞)------------------------->String
String------------------(Integer.parseInt())--------------->int
Integer-----------------(IValue())--------------->int
學(xué)會(huì)查看javadoc的幫助文檔。要先關(guān)注要使用方法的返回值類型,也就是要獲得內(nèi)容的類型,然后看方法名,JDK中的方法名基本上是見名知義,參數(shù)表,就是看需要什么才可以獲得的需要的那些內(nèi)容,也要看自己能夠提供什么。注意:“==〞在任何時(shí)候都是比較地址,這種比較永遠(yuǎn)不會(huì)被覆蓋。程序員自己編寫的類和JDK類是一種合作關(guān)系?!惨?yàn)槎鄳B(tài)的存在,可能存在我們調(diào)用JDK類的情況,也可能存在JDK自動(dòng)調(diào)用我們的類的情況?!匙⒁猓侯愋娃D(zhuǎn)換中double\Interger\String之間的轉(zhuǎn)換最多?!沧ⅲ核惺褂脙?nèi)部類的地方都可以不用內(nèi)部類,但使用內(nèi)部類可以使程序更加的簡(jiǎn)潔,便于命名標(biāo)準(zhǔn)和劃分層次構(gòu)造〕。內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。*內(nèi)部類可為靜態(tài),可用protected和private修飾?!捕獠款惒豢梢裕喉敿?jí)類只能使用public和default〕。*java文件中沒(méi)有publicclass,允許類名和文件不同名。內(nèi)部類內(nèi)部類也就是定義在類內(nèi)部的類。內(nèi)部類的分類1,成員內(nèi)部類、2,局部?jī)?nèi)部類、3,靜態(tài)內(nèi)部類、4,匿名內(nèi)部類〔圖形是要用到,必須掌握〕。成員內(nèi)部類四個(gè)訪問(wèn)權(quán)限修飾符都可以修飾成員內(nèi)部類。內(nèi)部類和外部類在編譯時(shí)時(shí)不同的兩個(gè)類,內(nèi)部類對(duì)外部類沒(méi)有任何依賴。內(nèi)部類是一種編譯時(shí)語(yǔ)法,在編譯時(shí)生成的各自的字節(jié)碼文件,內(nèi)部類和外部類沒(méi)有關(guān)系。內(nèi)部類中可以訪問(wèn)外部類的私有成員。作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列。內(nèi)部類和外部類的實(shí)例變量可以共存。在內(nèi)部類中訪問(wèn)實(shí)例變量:this.屬性在內(nèi)部類訪問(wèn)外部類的實(shí)例變量:外部類名,this.屬性。在外部類的外部訪問(wèn)內(nèi)部類,使用out.inner。成員內(nèi)部類的特點(diǎn):1.內(nèi)部類作為外部類的成員,可以訪問(wèn)外部類的私有成員或?qū)傩??!布词箤⑼獠款惵暶鳛閜rivate,但是對(duì)于處于其內(nèi)部的內(nèi)部類還是可見的。〕2.用內(nèi)部類定義在外部類中不可訪問(wèn)的屬性。這樣就在外部類中實(shí)現(xiàn)了比外部類的private還要小的訪問(wèn)權(quán)限。注意:內(nèi)部類是個(gè)編譯時(shí)的概念,一旦編譯成功,就會(huì)成為完全不同的兩類。對(duì)于一個(gè)名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。3.成員內(nèi)部類不能含有靜態(tài)成員。建立內(nèi)部類對(duì)象時(shí)應(yīng)注意:在外部類的內(nèi)部可以直接使用inners=newinner();〔因?yàn)橥獠款愔纈nner是哪個(gè)類,所以可以生成對(duì)象?!扯谕獠款惖耐獠浚伞瞡ew〕一個(gè)內(nèi)部類對(duì)象,需要首先建立一個(gè)外部類對(duì)象〔外部類可用〕,然后在生成一個(gè)內(nèi)部類對(duì)象,內(nèi)部類的類名是外部類類名.內(nèi)部類類名。
Outero=newOuter();
Outer.Innerin=o.new.Inner()
靜態(tài)內(nèi)部類〔注意:前三種內(nèi)部類與變量類似,所以可以對(duì)照參考變量〕靜態(tài)內(nèi)部類定義在類中,任何方法外,用staticclass定義。靜態(tài)內(nèi)部類只能訪問(wèn)外部類的靜態(tài)成員。生成〔new〕一個(gè)靜態(tài)內(nèi)部類不需要外部類成員:這是靜態(tài)內(nèi)部類和成員內(nèi)部類的區(qū)別。靜態(tài)內(nèi)部類的對(duì)象可以直接生成:
Outer.Innerin=newOuter.Inner();而不需要通過(guò)生成外部類對(duì)象來(lái)生成,這樣實(shí)際上使靜態(tài)內(nèi)部類成為了一個(gè)頂級(jí)類。靜態(tài)內(nèi)部類不可用private來(lái)進(jìn)展定義。注意:當(dāng)類與接口〔或者是接口與接口〕發(fā)生方法命名沖突的時(shí)候,此時(shí)必須使用內(nèi)部類來(lái)實(shí)現(xiàn)。用接口不能完全地實(shí)現(xiàn)多繼承,用接口配合內(nèi)部類才能實(shí)現(xiàn)真正的多繼承。例子:對(duì)于兩個(gè)類,擁有一樣的方法:
classPeople
{
run();
}
interfaceMachine
{
run();
}
有一個(gè)robot類:classRobotextendsPeopleimplementMachine,run()不可直接實(shí)現(xiàn)。
interfaceMachine
{
voidrun();
}
classPerson
{
voidrun()
{
System.out.println("run");
}
}
classRobotextendsPerson
{
privateclassMachineHeartimplementsMachine
{
publicvoidrun()
{
System.out.println("heartrun");
}
}
publicvoidrun()
{
System.out.println("Robotrun");
}
MachinegetMachine()
{
returnnewMachineHeart();
}
}
classTest
{
publicstaticvoidmain(String[]args)
{
Robotrobot=newRobot();Machinem=robot.getMachine();m.run();robot.run();
}
}
局部?jī)?nèi)部類在方法中定義的內(nèi)部類稱為局部?jī)?nèi)部類。與局部變量類似,在局部?jī)?nèi)部類前不加修飾符public和private,其范圍為定義它的代碼塊。注意:局部?jī)?nèi)部類不僅可以訪問(wèn)外部類私有實(shí)例變量,但可以訪問(wèn)外部類的局部常量〔也就是局部變量必須為final的〕。在類外不可直接訪問(wèn)局部?jī)?nèi)部類〔保證局部?jī)?nèi)部類對(duì)外是不可見的〕。在方法中才能調(diào)用其局部?jī)?nèi)部類。通過(guò)內(nèi)部類和接口到達(dá)一個(gè)強(qiáng)制的弱耦合,用局部?jī)?nèi)部類來(lái)實(shí)現(xiàn)接口,并在方法中返回接口類型,使局部?jī)?nèi)部類不可見,屏蔽實(shí)現(xiàn)類的可見性。局部?jī)?nèi)部類寫法
publicclassTestLocalInnerClass
{
publicstaticvoidmain(String[]args)
{
Outero=newOuter();finalinta=9;o.print(a);
}
}
classOuter
{
privateintindex=100;
publicvoidprint(finalinta)
{
finalintb=10;System.out.println(a);
classInner
{
publicvoidprint()
{
System.out.println(index);System.out.println(a);System.out.println(b);
}
}
Inneri=newInner();i.print();
}
}
匿名內(nèi)部類匿名內(nèi)部類是一種特殊的局部?jī)?nèi)部類,它是通過(guò)匿名類實(shí)現(xiàn)接口。匿名內(nèi)部類的特點(diǎn):1,一個(gè)類用于繼承其他類或是實(shí)現(xiàn)接口,并不需要增加額外的方法,只是對(duì)繼承方法的事先或是覆蓋。2,只是為了獲得一個(gè)對(duì)象實(shí)例,不許要知道其實(shí)際類型。3,類名沒(méi)有意義,也就是不需要使用到。注意:一個(gè)匿名內(nèi)部類一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類,沒(méi)有類名,根據(jù)多態(tài),我們使用其父類名。因其為局部?jī)?nèi)部類,那么局部?jī)?nèi)部類的所有限制都對(duì)其生效。匿名內(nèi)部類是唯一一種無(wú)構(gòu)造方法類。大局部匿名內(nèi)部類是用于接口回調(diào)用的。匿名內(nèi)部類在編譯的時(shí)候由系統(tǒng)自動(dòng)起名Out$1.class。如果一個(gè)對(duì)象編譯時(shí)的類型是接口,那么其運(yùn)行的類型為實(shí)現(xiàn)這個(gè)接口的類。因匿名內(nèi)部類無(wú)構(gòu)造方法,所以其使用范圍非常的有限。當(dāng)需要多個(gè)對(duì)象時(shí)使用局部?jī)?nèi)部類,因此局部?jī)?nèi)部類的應(yīng)用相比照擬多。匿名內(nèi)部類中不能定義構(gòu)造方法。匿名內(nèi)部類的寫法:
interfaceA
{
voidia();
}
classB
{
publicAbc()
{
returnnewA
{
voidia()
{
}
};
}
}
使用匿名內(nèi)部類:
Bb=newB();Aa=b.bc();a.ia();Exception〔例外/異?!硨?duì)于程序可能出現(xiàn)的錯(cuò)誤應(yīng)該做出預(yù)案。例外是程序中所有出乎意料的結(jié)果。〔關(guān)系到系統(tǒng)的強(qiáng)健性〕java會(huì)將所有的異常封裝成為一個(gè)對(duì)象,其基本父類為Throwable。異常的分類Error和Exception。一個(gè)Error對(duì)象表示一個(gè)程序錯(cuò)誤,指的是底層的、低級(jí)的、不可恢復(fù)的嚴(yán)重錯(cuò)誤。此時(shí)程序一定會(huì)退出,因?yàn)橐呀?jīng)失去了運(yùn)行所必須的物理環(huán)境。對(duì)于Error錯(cuò)誤我們無(wú)法進(jìn)展處理,因?yàn)槲覀兪峭ㄟ^(guò)程序來(lái)應(yīng)對(duì)錯(cuò)誤,可是程序已經(jīng)退出了。我們可以處理的Throwable類中只有Exception類的對(duì)象〔例外/異?!?。Exception有兩個(gè)子類:
Runtimeexception〔未檢查異?!晨梢栽诰幊虝r(shí)防止,可處理可不處理非Runtimeexception〔已檢查異?!潮仨氝M(jìn)展處理。注意:無(wú)論是未檢查異常還是已檢查異常在編譯的時(shí)候都不會(huì)被發(fā)現(xiàn),在編譯的過(guò)程中檢查的是程序的語(yǔ)法錯(cuò)誤,而異常是一個(gè)運(yùn)行時(shí)程序出錯(cuò)的概念。在Exception中,所有的非未檢查異常都是已檢查異常,沒(méi)有另外的異常??!未檢查異常是因?yàn)槌绦騿T沒(méi)有進(jìn)展必要的檢查,因?yàn)樗氖韬龊湾e(cuò)誤而引起的異常。一定是屬于虛擬機(jī)內(nèi)部的異?!脖确娇罩羔槨场?yīng)對(duì)未檢查異常就是養(yǎng)成良好的檢查習(xí)慣。已檢查異常是不可防止的,對(duì)于已檢查異常必須實(shí)現(xiàn)定義好應(yīng)對(duì)的方法。已檢查異常肯定跨越出了虛擬機(jī)的范圍。〔比方“未找到文件〞〕異常的傳遞如何處理已檢查異?!矊?duì)于所有的已檢查異常都要進(jìn)展處理〕:首先了解異常形成的機(jī)制:當(dāng)一個(gè)方法中有一條語(yǔ)句出現(xiàn)了異常,它就會(huì)throw〔拋出〕一個(gè)例外對(duì)象〔throw異常對(duì)象〕,然后后面的語(yǔ)句不會(huì)執(zhí)行返回上一級(jí)方法,其上一級(jí)方法承受到了例外對(duì)象之后,有可能對(duì)這個(gè)異常進(jìn)展處理,也可能將這個(gè)異常轉(zhuǎn)到它的上一級(jí)。注意:當(dāng)一個(gè)方法中出現(xiàn)異常,沒(méi)有進(jìn)展異常處理,方法就會(huì)把異常對(duì)象作為返回值返回。如果有異常進(jìn)入虛擬機(jī),那么虛擬機(jī)就會(huì)立刻中止程序的執(zhí)行。異常的處理方式非RuntimeException〔已檢查異?!钞惓1仨毺幚怼H绻惶幚砭幾g出錯(cuò)。對(duì)于接收到的已檢查異常有兩種處理方式:throws和try..catch(...){}方法。注意:出錯(cuò)的方法有可能是JDK,也可能是程序員寫的程序,無(wú)論誰(shuí)寫的,拋出一定用throw。在方法的定義中聲明方法可能拋出的異常,用〔throws異常類名,異常類名〕,聲明這個(gè)方法將不處理異常,并把異常交給上一級(jí)方法處理。可以拋出的是實(shí)際產(chǎn)生異常的父類的異常對(duì)象。例:publicvoidprint()throwsException。對(duì)于方法a,如果它定義了throwsException。那么當(dāng)它調(diào)用的方法b返回異常對(duì)象時(shí),方法a并不處理,而將這個(gè)異常對(duì)象向上一級(jí)返回,如果所有的方法均不進(jìn)展處理,返回到主方法,程序中止?!惨乐顾械姆椒ǘ挤祷氐氖褂梅椒?,因?yàn)檫@樣出現(xiàn)一個(gè)很小的異常就會(huì)令程序中止〕。如果在方法的程序中有一行thrownewException(),返回錯(cuò)誤,那么其后的程序不執(zhí)行。因?yàn)殄e(cuò)誤返回后,后面的程序肯定沒(méi)有時(shí)機(jī)執(zhí)行,那么JAVA認(rèn)為以后的程序沒(méi)有存在的必要。Try..catch捕獲異常對(duì)于try……catch格式:
try{可能出現(xiàn)錯(cuò)誤的代碼塊}catch(exceptione){進(jìn)展處理的代碼};對(duì)象變量的聲明用這種方法,如果代碼正確,那么程序不經(jīng)過(guò)catch語(yǔ)句直接向下運(yùn)行;如果代碼不正確,則將返回的異常對(duì)象和e進(jìn)展匹配,如果匹配成功,則處理其后面的異常處理代碼?!踩绻胑xception來(lái)聲明e的話,因?yàn)閑xception為所有exception對(duì)象的父類,所有肯定匹配成功〕。處理完代碼后這個(gè)例外就完全處理完畢,程序會(huì)接著從出現(xiàn)異常的地方向下執(zhí)行〔是從出現(xiàn)異常的地方還是在catch后面呢利用程序進(jìn)展驗(yàn)證〕。最后程序正常退出。try塊中的代碼如果沒(méi)有出現(xiàn)異常,就會(huì)跳過(guò)catch,正常執(zhí)行。try中如果發(fā)現(xiàn)錯(cuò)誤,即跳出try塊去匹配catch,那么try后面的語(yǔ)句就不會(huì)被執(zhí)行。一個(gè)try可以跟進(jìn)多個(gè)catch語(yǔ)句,用于處理不同情況。當(dāng)一個(gè)try只能匹配一個(gè)catch。我們可以寫多個(gè)catch語(yǔ)句,但是不能將父類型的exception的位置寫在子類型的excepiton之前,因?yàn)檫@樣父類型肯定先于子類型被匹配,所有子類型就成為廢話,java中是不允許寫廢話的,所以編譯會(huì)出錯(cuò)。在try,catch后還可以再跟一子句finally。其中的代碼語(yǔ)句無(wú)論如何〔無(wú)論有沒(méi)有異?!扯紩?huì)被執(zhí)行〔因?yàn)閒inally子句的這個(gè)特性,所以一般將釋放資源,關(guān)閉連接的語(yǔ)句寫在里面〕。finally中的代碼在和try中的代碼的沖突時(shí),finally中的代碼一定會(huì)被執(zhí)行且會(huì)忽略try中的代碼。但是System.exit(0);(虛擬機(jī)退出語(yǔ)句)則不會(huì)去執(zhí)行fianlly中的代碼。
try{..}catch(..){..}
try{..}catch(..){}finally{..}
try{..}finally{}
以上三種寫法都可以.如果在程序中書寫了檢查〔拋出〕exception但是沒(méi)有對(duì)這個(gè)可能出現(xiàn)的檢查結(jié)果進(jìn)展處理,那么程序就會(huì)報(bào)錯(cuò)。而如果只有處理情況〔try〕而沒(méi)有相應(yīng)的catch子句,則編譯還是通不過(guò)。如何知道在編寫的程序中會(huì)出現(xiàn)例外呢1.調(diào)用方法,查看API中查看方法中是否有已檢查錯(cuò)誤。2.在編譯的過(guò)程中看提示信息,然后加上相應(yīng)的處理。Throwable有一個(gè)message屬性,在使用catch的時(shí)候可以調(diào)用:
Catch(IOExceptione){System.out.println(e.message())};
Catch(IOExceptione){e.printStackTrace()};以上兩條語(yǔ)句都是可以打印出錯(cuò)的過(guò)程信息,告訴我們出錯(cuò)類型所歷經(jīng)的過(guò)程,在調(diào)試的中非常有用。開發(fā)中的兩個(gè)道理:①如何控制try的范圍:根據(jù)操作的連動(dòng)性和相關(guān)性,如果前面的程序代碼塊拋出的錯(cuò)誤影響了后面程序代碼的運(yùn)行,那么這個(gè)我們就說(shuō)這兩個(gè)程序代碼存在關(guān)聯(lián),應(yīng)該放在同一個(gè)try中。②對(duì)已經(jīng)查出來(lái)的例外,有throw(消極)和trycatch〔積極〕兩種處理方法。對(duì)于throws把異常拋到trycatch能夠很好地處理例外的位置〔即放在具備對(duì)例外進(jìn)展處理的能力的位置〕。如果沒(méi)有處理能力就繼續(xù)上拋。當(dāng)我們自己定義一個(gè)例外類的時(shí)候必須使其繼承excepiton或者RuntimeException。throw是一個(gè)語(yǔ)句,用來(lái)做拋出例外的功能。而throws是表示如果下級(jí)方法中如果有例外拋出,那么本方法不做處理,繼續(xù)向上拋出。throws后跟的是例外類型。注意:方法的覆蓋中,如果子類的方法拋出的例外是父類方法拋出的例外的父類型,那么編譯就會(huì)出錯(cuò):子類無(wú)法覆蓋父類。結(jié)論:子類方法不可比父類方法拋出更多的例外。子類拋出的例外或者與父類拋出的例外一致,或者是父類拋出例外的子類型?;蛘咦宇愋筒粧伋隼?。如果父類型無(wú)throws時(shí),子類型也不允許出現(xiàn)throws。此時(shí)只能使用trycatch。斷言是一種調(diào)試工具〔assert〕斷言(assert)其后跟的是布爾類型的表達(dá)式,如果表達(dá)式結(jié)果為真不影響程序運(yùn)行。如果為假系統(tǒng)出現(xiàn)低級(jí)錯(cuò)誤,在屏幕上出現(xiàn)assert信息。Assert只是用于調(diào)試。在產(chǎn)品編譯完成后上線assert代碼就被刪除了。集合類集合〔集合類的對(duì)象〕是用來(lái)管理其他假設(shè)干對(duì)象的,它類似于C++標(biāo)準(zhǔn)模板庫(kù)中的容器,不過(guò)在JAVA的集合類的對(duì)象中可以用來(lái)存放多種類型的對(duì)象。接口和類共同構(gòu)成了一個(gè)集合框架,集合的概念,一個(gè)對(duì)象可以裝載多個(gè)對(duì)象,這個(gè)對(duì)象就是集合對(duì)象。集合框架1,接口
Collection用來(lái)管理多個(gè)對(duì)象,集合中的每個(gè)元素都是對(duì)象。Map,Map中沒(méi)有對(duì)象,而是鍵值對(duì),由Key,value組成的鍵值對(duì),Key是不可重復(fù)的。value是可以一樣的,一個(gè)Key和一個(gè)value一一對(duì)應(yīng)。集合中用到的類,接口在java.util包中,在使用時(shí)注意將其引入import。
Collection接口〔以下介紹其子接口〕1)List一個(gè)List的實(shí)現(xiàn)類的對(duì)象在管理多個(gè)對(duì)象時(shí)會(huì)按順序組織對(duì)象〔即按照將對(duì)象放入的順序存儲(chǔ)〕,List實(shí)現(xiàn)類的對(duì)象是有順序的,List實(shí)現(xiàn)類對(duì)象中的內(nèi)容是是可重復(fù)的?!沧⒁?,順序和排序的區(qū)別〕
2)Set一個(gè)Set的實(shí)現(xiàn)類表示一個(gè)數(shù)學(xué)概念上的集合,Set的實(shí)現(xiàn)類的對(duì)象中的元素是無(wú)順序的,也就是不會(huì)按照輸入順序來(lái)存放,Set的實(shí)現(xiàn)類對(duì)象中的元素是不重復(fù)的。3)SortedSet,他是Set的子接口,他的實(shí)現(xiàn)類會(huì)對(duì)集合中的元素進(jìn)展排序。但是要指定排序規(guī)則,他會(huì)按排序規(guī)則進(jìn)展排序。
Map接口〔以下介紹其子接口〕SortedMap,這個(gè)接口的實(shí)現(xiàn)類同樣可以實(shí)現(xiàn),不過(guò)是對(duì)鍵值對(duì)中的Key進(jìn)展排序,這個(gè)接口的實(shí)現(xiàn)類也是要指定排序規(guī)則的。List接口的實(shí)現(xiàn)類
1>ArrayList是接近于功能的集合類,ArryList的實(shí)質(zhì)就是一個(gè)會(huì)自動(dòng)增長(zhǎng)的數(shù)組,ArrayList是用封裝的數(shù)組來(lái)實(shí)現(xiàn)的List接口的。Collection的實(shí)現(xiàn)類對(duì)象的遍歷方式是用迭代來(lái)實(shí)現(xiàn)的。在使用迭代器時(shí)先要活得一個(gè)迭代器的對(duì)象,Iterator〔迭代器接口〕這是一個(gè)接口,迭代器是在集合類中實(shí)現(xiàn)的,也就是說(shuō),他是一個(gè)內(nèi)部類〔匿名內(nèi)部類〕實(shí)現(xiàn)的。Iterator接口中定義的常用方法方法hasNext(),next()。hasNext(),這個(gè)方法會(huì)使用一個(gè)游標(biāo),并通過(guò)判斷游標(biāo)指向的位置是否存放有對(duì)象。next()方法也是Iterator接口中定義好的方法,這個(gè)方法會(huì)使游標(biāo)指向下一個(gè)元素的位置,游標(biāo)會(huì)跳過(guò)第一個(gè)元素,并返回其中的內(nèi)容。
Collections這是一個(gè)工具類,也是java.util包中的,這個(gè)類中的sort(list接口的實(shí)現(xiàn)類的對(duì)象)方法,其參數(shù)是一個(gè)集合類的對(duì)象,這個(gè)方法使用來(lái)對(duì)集合類的對(duì)象進(jìn)展排序的。以后,我將以集合這個(gè)名字來(lái)稱呼集合類的對(duì)象。,對(duì)于字符串對(duì)象內(nèi)容的集合來(lái)說(shuō)會(huì)按字典順序排序〔升序〕,對(duì)于數(shù)字內(nèi)容的集合排序也會(huì)按照升序排序。排序可一份為兩局部?jī)?nèi)容,一個(gè)是排序的規(guī)則,也就是按照什么來(lái)進(jìn)展排序,并且排成什么樣的順序。第二個(gè)就是排序的算法,他決定了排序的效率。在對(duì)自定義的集合內(nèi)容類型排序時(shí),需要先定義那個(gè)類型的排序規(guī)則。Comparable接口,這個(gè)接口中只定義了一個(gè)compareTo(Objecto),方法的返回至類型是整型,如果當(dāng)前對(duì)象大于參數(shù)對(duì)象就返回正數(shù),當(dāng)前對(duì)象等于參數(shù)對(duì)象是就返回0,當(dāng)前對(duì)象小于參數(shù)對(duì)象時(shí)就返回負(fù)值,這樣寫就是升序排列,反之則是進(jìn)展降序排列,在實(shí)現(xiàn)這個(gè)接口中的方法時(shí),返回值定義方式,只有這兩種。根據(jù)指定類型的排序規(guī)則實(shí)現(xiàn)了Comparable接口,那么就可以對(duì)存有這個(gè)類型的集合進(jìn)展整體排序。Comparable接口,也叫做可比較接口。這個(gè)接口在java.lang包下。只要實(shí)現(xiàn)了這個(gè)接口,就是可排序的。接下來(lái)介紹另外一種對(duì)自定義類型對(duì)象的集合整體排序的方法,也就是實(shí)現(xiàn)比較器接口〔Comparator〕,這個(gè)接口中定義了一個(gè)compare(Objecto1,Objecto2)方法來(lái)比較兩個(gè)對(duì)象,這個(gè)方法的返回值定義和上面介紹的那個(gè)方法是一樣。注意:在API,幫助文檔中以上兩個(gè)方法的參數(shù)類型是T,這代表的模板類型,也就是集合中存放的內(nèi)容的類型,在JDK1。4中其參數(shù)就是Object類型,模板類型的詳細(xì)內(nèi)容會(huì)在最后的JDK5。0新特性中講到。Comparator接口可以在匿名內(nèi)部類中實(shí)現(xiàn),Collections中的sort(集合了的對(duì)象,比較器)方法,可以對(duì)自定義類型內(nèi)容的集合進(jìn)展整體排序。
2>LinkedList,它是List接口的實(shí)現(xiàn)類,其底層是用雙向循環(huán)鏈表來(lái)實(shí)現(xiàn)的。注意:ArrayList的查詢效率比較高,增刪動(dòng)作的效率比較差,適用于查詢比較頻繁,增刪動(dòng)作較少的元素管理的集合。LinkedList的查詢效率低,但是增刪效率很高。適用于增刪動(dòng)作的比較頻繁,查詢次數(shù)較少的元素管理集合。ArrayList,LinkedList都是線程不安全的。實(shí)現(xiàn)堆棧1,數(shù)組〔ArrayList,增刪效率比較低,不適合〕2,LinkedList〔實(shí)現(xiàn)堆棧的好方法〕3,java。util。Stack類,Stack是Vector的子類,Vector類是一個(gè)線程安全的〔是一個(gè)重量級(jí)的類〕,并繼承了Vector的方法,Verctor類〔這個(gè)類也是List接口的實(shí)現(xiàn)類〕和ArrayList的功能近乎一樣?!膊煌扑]使用Stack類來(lái)實(shí)現(xiàn)堆棧〕。Set接口的實(shí)現(xiàn)類
HashSet
Set的實(shí)現(xiàn)類的集合對(duì)象中不能夠有重復(fù)元素,HashSet也一樣他是使用了一種標(biāo)識(shí)來(lái)確定元素的不重復(fù),HashSet用一種算法來(lái)保證HashSet中的元素是不重復(fù)的,HashSet的底層實(shí)現(xiàn)還是數(shù)組。Object類中的hashCode()的方法是所有子類都會(huì)繼承這個(gè)方法,這個(gè)方法會(huì)用Hash算法算出一個(gè)Hash〔哈?!炒a值返回,HashSet會(huì)用Hash碼值去和數(shù)組長(zhǎng)度取模,?!策@個(gè)模就是對(duì)象要存放在數(shù)組中的位置〕一樣時(shí)才會(huì)判斷數(shù)組中的元素和要參加的對(duì)象的內(nèi)容是否一樣,如果不同才會(huì)添加進(jìn)去。Hash算法是一種散列算法。注意:所以要存入HashSet的集合對(duì)象中的自定義類必須覆蓋hashCode(),equals()兩個(gè)方法,才能保證集合中元素容不重復(fù)。在覆蓋和hashCode()方法時(shí),要使一樣對(duì)象的hashCode()方法返回一樣值,覆蓋equals()方法再判斷其內(nèi)容。為了保證效率,所以在覆蓋hashCode()方法時(shí),也要盡量使不同對(duì)象盡量返回不同的Hash碼值。如果數(shù)組中的元素和要參加的對(duì)象的hashCode()返回了一樣的Hash值〔一樣對(duì)象〕,才會(huì)用equals()方法來(lái)判斷兩個(gè)對(duì)象的內(nèi)容是否一樣。SortedSet接口是Set的子接口。TreeSet是SortedSet接口的實(shí)現(xiàn)類,他可以對(duì)集合中的元素進(jìn)展排序。要存放在TreeSet中自定義類的對(duì)象,這個(gè)類要么是已經(jīng)實(shí)現(xiàn)了Comparable接口,要么是能給出Comparator比較器,TreeSet可以自動(dòng)過(guò)濾掉重復(fù)元素所以不用重載hashCode()方法,TreeSet會(huì)根據(jù)比較規(guī)則判斷元素內(nèi)容是否一樣,TreeSet會(huì)在元素存入世就進(jìn)展了排序。〔在TreeSet給出排序規(guī)則時(shí),一定要注意對(duì)象內(nèi)容相等的條件,一定要注意在主觀的認(rèn)為兩個(gè)對(duì)象內(nèi)容一樣時(shí),才可以使用比較少的條件來(lái)進(jìn)展判斷〕在要排序時(shí)才使用TreeSet類〔存儲(chǔ)效率比較低〕,HashSet的存儲(chǔ)效率比較高,在需要為HashSet的對(duì)象排序時(shí),就可以把HashSet中的元素放入TreeSet。Map接口的實(shí)現(xiàn)類Map中只可以存放鍵值對(duì)〔Key,value〕,其中Key是不可以重復(fù)的。Key和value是一一對(duì)應(yīng)的。HashMap是Map接口的實(shí)現(xiàn)類,Key時(shí)無(wú)序存放的,其中Key是不可以重復(fù)的,它也是通過(guò)Hash碼值來(lái)保證Key不重復(fù)的,Key和value是一一對(duì)應(yīng)的。如果要參加的鍵值對(duì)和HashMap中鍵值對(duì)的Key是一樣的就會(huì)將這個(gè)集合中的Key所隊(duì)?wèi)?yīng)的value值進(jìn)展覆蓋,在使用自定義類型作為Key時(shí),那就是要覆蓋hashCode(),equals()方法,也就是和HashSet中要放入自定義類型是的處理方法一樣。這個(gè)類的對(duì)象是線程不安全的。在遍歷Map時(shí),要使用其keySet()方法獲得Key的一個(gè)Set集合,可以通過(guò)遍歷這個(gè)Set,用get()方法來(lái)獲得Key所對(duì)應(yīng)的value,也就遍歷了Map。Hashtabl也是Map接口的實(shí)現(xiàn)類,他和HashMap比較相似,只不過(guò)這個(gè)類對(duì)象是重量級(jí)的,也是線程安全的。他不允許Key和value為null。Properties,這個(gè)類是Hashtable的子類,他的Key和value只能是字符串。SortedMap是Map的子接口TreeMap是SortedMap的實(shí)現(xiàn)類,他會(huì)按照Key進(jìn)展排序。和TreeSet類一樣,在使用自定義類作Key時(shí),要用自定義類實(shí)現(xiàn)Comparable接口。注意:其實(shí)Ha
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年中國(guó)帶銹擦拭磷化液數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)室內(nèi)一體化分支分配器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)可拆式膠管總成數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)單桿毛巾長(zhǎng)架數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)交流電動(dòng)機(jī)起動(dòng)器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024年中國(guó)鑄造用自硬呋喃樹脂市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)纖維織物制品市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)一字抽手市場(chǎng)調(diào)查研究報(bào)告
- 2024八年級(jí)數(shù)學(xué)上冊(cè)第12章一次函數(shù)12.2一次函數(shù)第5課時(shí)上課課件新版滬科版
- 2024年滁州大客車從業(yè)資格證考試試題
- DBJ33_T 1268-2022 工程建設(shè)工法編制標(biāo)準(zhǔn)
- 感染病例慢性病毒EB感染
- 信息技術(shù)學(xué)科師徒結(jié)對(duì)師傅計(jì)劃
- 11工作審批流程及權(quán)限
- 目視檢測(cè)規(guī)范
- 綜合組教研活動(dòng)記錄【精選文檔】
- 上冊(cè)文字表達(dá)式-符號(hào)表達(dá)式-化學(xué)式
- 《優(yōu)美的人物動(dòng)態(tài)》教學(xué)設(shè)計(jì)
- 精選范文--防高溫施工、防汛防臺(tái)風(fēng)專項(xiàng)監(jiān)理實(shí)施細(xì)則
- 江蘇省城市設(shè)計(jì)編制導(dǎo)則
- 2022年鐵路貨運(yùn)員考試題庫(kù)(匯總版)
評(píng)論
0/150
提交評(píng)論