下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.JAVA的面向?qū)ο缶幊讨R(shí)點(diǎn)解析面向?qū)ο笾饕槍?duì)面向過(guò)程。面向過(guò)程的基本單元是函數(shù)。什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物皆對(duì)象)所有的事物都有兩個(gè)方面:有什么(屬性):用來(lái)描述對(duì)象。能夠做什么(方法):告訴外界對(duì)象有那些功能。后者以前者為基礎(chǔ)。大的對(duì)象的屬性也可以是一個(gè)對(duì)象。為什么要使用面向?qū)ο螅菏紫龋嫦驅(qū)ο蠓先祟惪创挛锏囊话阋?guī)律。對(duì)象的方法的實(shí)現(xiàn)細(xì)節(jié)是屏蔽的,只有對(duì)象方法的實(shí)現(xiàn)者了解細(xì)節(jié)。方法的定義非常重要。方法有參數(shù),也可能有返回值。注意區(qū)分:對(duì)象(本身)、對(duì)象的實(shí)現(xiàn)者、對(duì)象的調(diào)用者。分析對(duì)象主要從方法開始。我們通過(guò)類來(lái)看待對(duì)象,類是對(duì)象的抽象。其次,采用面向
2、對(duì)象方法可以使系統(tǒng)各部分各司其職、各盡所能。對(duì)象之間的耦合性一定要低(比如不同硬盤和不同主板之間的關(guān)系)。這樣才能使每個(gè)對(duì)象本身做成最好的。對(duì)于對(duì)象的要求:高內(nèi)聚、低耦合,這樣容易拼裝成為一個(gè)系統(tǒng)。實(shí)現(xiàn)高內(nèi)聚就是要最大限度低提高復(fù)用性(復(fù)用性好是因?yàn)楦邇?nèi)聚)。可復(fù)用性是OOP的基礎(chǔ)。比較面向過(guò)程的思想和面向?qū)ο蟮乃枷耄好嫦蜻^(guò)程的思想:由過(guò)程、步驟、函數(shù)組成,以過(guò)程為核心;面向?qū)ο蟮乃枷耄阂詫?duì)象為中心,先開發(fā)類,得到對(duì)象,通過(guò)對(duì)象之間相互通信實(shí)現(xiàn)功能。面向過(guò)程是先有算法,后有數(shù)據(jù)結(jié)構(gòu)。面向?qū)ο笫窍扔袛?shù)據(jù)結(jié)構(gòu),然后再有算法。在用面向?qū)ο笏枷腴_發(fā)的過(guò)程中,可以復(fù)用對(duì)象就進(jìn)行復(fù)用,如無(wú)法進(jìn)行復(fù)用則開發(fā)
3、新的對(duì)象。開發(fā)過(guò)程是用對(duì)個(gè)簡(jiǎn)單的對(duì)象的多個(gè)簡(jiǎn)單的方法,來(lái)實(shí)現(xiàn)復(fù)雜的功能 。從語(yǔ)法上來(lái)看,一個(gè)類是一個(gè)新的數(shù)據(jù)類型。在面向?qū)ο缶幊讨校撕?jiǎn)單數(shù)據(jù)類型,就是對(duì)象類型。定義類的格式:class Student代碼注意類名中單詞的首字母大寫。實(shí)例變量:定義在類中但在任何方法之外。(New出來(lái)的均有初值)局部變量:定義在方法之中的變量。局部變量要先賦值,再進(jìn)行運(yùn)算,而實(shí)例變量均已經(jīng)賦初值。這是局部變量和實(shí)例變量的一大區(qū)別。實(shí)例變量的對(duì)象賦值為null。局部變量不允許X圍內(nèi)定義兩個(gè)同名變量。實(shí)例變量的作用域在本類中完全有效,當(dāng)被其他的類調(diào)用的時(shí)候也可能有效。實(shí)例變量和局部變量允許命名沖突。書寫方法的格式
4、:修飾符返回值 方法名 調(diào)用過(guò)程中 方法體可能出現(xiàn)的例外 publicint/voidaddNumber(參數(shù))throw Excepion 例:public int addNumber(int a,int b)注:方法名中的參數(shù)int a,int b為局部變量類方法中的一類特殊方法:構(gòu)造方法。構(gòu)造方法是當(dāng)用類生成對(duì)象時(shí),系統(tǒng)在生成對(duì)象的過(guò)程中利用的方法。注意:構(gòu)造方法在生成對(duì)象的時(shí)候會(huì)被調(diào)用,但并不是構(gòu)造方法生成了對(duì)象。構(gòu)造方法沒有返回值。格式為:public 方法名。構(gòu)造方法的方法名與類名相同。構(gòu)造方法是在對(duì)象生成的過(guò)程中自動(dòng)調(diào)用,不可能利用指令去調(diào)用。在一個(gè)對(duì)象的生成周期中構(gòu)造方法只用一
5、次,一旦這個(gè)對(duì)象生成,那么這個(gè)構(gòu)造方法失效。用類來(lái)生成對(duì)象的語(yǔ)句:Student s=new Student()。第一個(gè)Student表示這是用Student類進(jìn)行定義?!癝tudent()”表示調(diào)用一個(gè)無(wú)參數(shù)的構(gòu)造方法。如果()中有參數(shù),則系統(tǒng)構(gòu)造對(duì)象的過(guò)程中調(diào)用有參的方法。此時(shí)S稱為一個(gè)對(duì)象變量。 Student s的存儲(chǔ)區(qū)域存放的是地址:一個(gè)對(duì)象在硬盤上占有一個(gè)連續(xù)地址,首地址賦予s空間。S稱為對(duì)象Student的引用。注意:在對(duì)象變量中存放的是引用(地址);在簡(jiǎn)單變量中存放的是數(shù)值??梢詷?gòu)造多個(gè)構(gòu)造方法,但多個(gè)構(gòu)造方法的參數(shù)表一定不同,參數(shù)順序不同即屬于不同的構(gòu)造方法:pub
6、lic student(string name,int a)public student(int a,string name)為兩個(gè)不同的構(gòu)造方法。如果我們未給系統(tǒng)提供一個(gè)構(gòu)造方法,那么系統(tǒng)會(huì)自動(dòng)提供一個(gè)為空的構(gòu)造方法。練習(xí):寫一個(gè)類,定義一個(gè)對(duì)象,定義兩個(gè)構(gòu)造方法:一個(gè)有參,一個(gè)無(wú)參。(編寫一個(gè)程序驗(yàn)證對(duì)象的傳遞的值為地址)注意下面這種形式:static void changename(student stu)stu.setName “LUCY”注意生成新的對(duì)象與舊對(duì)象指向無(wú)關(guān),生成新對(duì)象生命消亡與舊對(duì)象無(wú)關(guān)。面向?qū)ο蠓椒ǖ闹剌d(overloading)和覆蓋(overriding)。在有些
7、JAVA書籍中將overriding稱為重載,overloading稱為過(guò)載。Overloading在一個(gè)類中可以定義多個(gè)同名方法,各個(gè)方法的參數(shù)表一定不同。但修飾詞可能相同,返回值也可能相同。在程序的編譯過(guò)程中根據(jù)變量類型來(lái)找相應(yīng)的方法。因此也有人認(rèn)為 overloading是編譯時(shí)的多態(tài),以后我們還會(huì)學(xué)到運(yùn)行時(shí)多態(tài)。為什么會(huì)存在overloading技術(shù)呢.作為應(yīng)對(duì)方法的細(xì)節(jié)。利用類型的差異來(lái)影響對(duì)方法的調(diào)用。吃()可以分為吃肉,吃菜,吃藥,在一個(gè)類中可以定義多個(gè)吃方法。構(gòu)造方法也可以實(shí)現(xiàn)overloading。例:public void teach();public void teach
8、(int a);public void teach(String a)為三種不同的方法。Overloading方法是從低向高轉(zhuǎn)。Byteshortfloatintlongdouble。在構(gòu)造方法中,this表示本類的其他構(gòu)造方法:student();student(string n) this();/表示調(diào)用student()如果調(diào)用student(int a)則為this(int a)。特別注意:用this調(diào)用其他構(gòu)造方法時(shí),this必須為第一條語(yǔ)句,然后才是其他語(yǔ)句。This表示當(dāng)前對(duì)象。Public void printNum() Int number=40; System.out.pr
9、intln(this.number); 此時(shí)打印的是實(shí)例變量,而非局部變量,即定義在類中而非方法中的變量。This.number表示實(shí)例變量。誰(shuí)調(diào)用this.number那么誰(shuí)即為當(dāng)前(this)對(duì)象的number方法。封裝:使對(duì)象的屬性盡可能私有,對(duì)象的方法盡可能的公開。用private表示此成員屬性為該類的私有屬性。Public表示該屬性(方法)公開;Private表示該屬性(方法)為只有本類內(nèi)部可以訪問(類內(nèi)部可見)。(想用private還要用set和get方法供其他方法調(diào)用,這樣可以保證對(duì)屬性的訪問方式統(tǒng)一,并且便于維護(hù)訪問權(quán)限以及屬性數(shù)據(jù)合法性)如果沒有特殊情況,屬性一定私有,方法該
10、公開的公開。如果不指明誰(shuí)調(diào)用方法,則默認(rèn)為this。區(qū)分實(shí)例變量和局部變量時(shí)一定要寫this。11.29繼承:父類(SuperClass)和 子類(SonClass)。父類的非私有化屬性和方法可以默認(rèn)繼承到子類。Class Son extends Father而如果父類中的私有方法被子類調(diào)用的話,則編譯報(bào)錯(cuò)。父類的構(gòu)造方法子類不可以繼承,更不存在覆蓋的問題。(非構(gòu)造方法可以)如果子類訪問父類的構(gòu)造方法,則在編譯的時(shí)候提示訪問不到該方法。JAVA中不允許多繼承,一個(gè)類有且只有一個(gè)父類(單繼承)。JAVA的數(shù)據(jù)結(jié)構(gòu)為樹型結(jié)構(gòu),而非網(wǎng)狀。(JAVA通過(guò)接口和內(nèi)部類實(shí)現(xiàn)多繼承)方法的覆蓋(overri
11、ding)方法的重載并不一定是在一個(gè)類中:子類可以從父類繼承一個(gè)方法,也可以定義一個(gè)同名異參的方法,也稱為overloading。當(dāng)子類從父類繼承一個(gè)無(wú)參方法,而又定義了一個(gè)同樣的無(wú)參方法,則子類新寫的方法覆蓋父類的方法,稱為覆蓋。(注意返回值類型也必須相同,否則編譯出錯(cuò)。)如果方法不同,則成重載。對(duì)于方法的修飾詞,子類方法要比父類的方法X圍更加的寬泛。父類為public,那么子類為private則出現(xiàn)錯(cuò)誤。之所以構(gòu)造方法先運(yùn)行父類再運(yùn)行子類是因?yàn)闃?gòu)造方法是無(wú)法覆蓋的。以下X圍依次由嚴(yán)到寬:private :本類訪問;default :表示默認(rèn),不僅本類訪問,而且是同包可見。Protected
12、:同包可見+不同包的子類可見Public :表示所有的地方均可見。當(dāng)構(gòu)造一個(gè)對(duì)象的時(shí)候,系統(tǒng)先構(gòu)造父類對(duì)象,再構(gòu)造子類對(duì)象。構(gòu)造一個(gè)對(duì)象的順序:(注意:構(gòu)造父類對(duì)象的時(shí)候也是這幾步) 遞歸地構(gòu)造父類對(duì)象; 順序地調(diào)用本類成員屬性賦初值語(yǔ)句; 本類的構(gòu)造方法。Super()表示調(diào)用父類的構(gòu)造方法。Super()也和this一樣必須放在第一行。This()用于調(diào)用本類的構(gòu)造方法。如果沒有定義構(gòu)造方法,那么就會(huì)調(diào)用父類的無(wú)參構(gòu)造方法,即super()。要養(yǎng)成良好的編程習(xí)慣:就是要加上默認(rèn)的父類無(wú)參的構(gòu)造方法。思考:可是如果我們沒有定義無(wú)參的構(gòu)造方法,而在程序中構(gòu)造了有參的構(gòu)造方法,那么如果方法中沒有
13、參數(shù),那么系統(tǒng)還會(huì)調(diào)用有參的構(gòu)造方法么.應(yīng)該不會(huì)。多態(tài):多態(tài)指的是編譯時(shí)類型變化,而運(yùn)行時(shí)類型不變。多態(tài)分兩種: 編譯時(shí)多態(tài):編譯時(shí)動(dòng)態(tài)重載; 運(yùn)行時(shí)多態(tài):指一個(gè)對(duì)象可以具有多個(gè)類型。對(duì)象是客觀的,人對(duì)對(duì)象的認(rèn)識(shí)是主觀的。例:Animal a=new Dog();查看格式名稱;Dog d=(Dog)a。聲明父類來(lái)引用子類。(思考上面的格式)運(yùn)行時(shí)多態(tài)的三原則:(應(yīng)用時(shí)為覆蓋)1、 對(duì)象不變;(改變的是主觀認(rèn)識(shí))2、 對(duì)于對(duì)象的調(diào)用只能限于編譯時(shí)類型的方法,如調(diào)用運(yùn)行時(shí)類型方法報(bào)錯(cuò)。在上面的例子中:Animal a=new Dog();對(duì)象a的編譯時(shí)類型為Animal,運(yùn)行時(shí)類型為dog。注意:
14、編譯時(shí)類型一定要為運(yùn)行時(shí)類型的父類(或者同類型)。對(duì)于語(yǔ)句:Dog d=(Dog)a。將d強(qiáng)制聲明為a類型,此時(shí)d為Dog(),此時(shí)d就可以調(diào)用運(yùn)行時(shí)類型。注意:a和d指向同一對(duì)象。3、 在程序的運(yùn)行時(shí),動(dòng)態(tài)類型判定。運(yùn)行時(shí)調(diào)用運(yùn)行時(shí)類型,即它調(diào)用覆蓋后的方法。關(guān)系運(yùn)算符:instanceofa instanceof Animal;(這個(gè)式子的結(jié)果是一個(gè)布爾表達(dá)式)a為對(duì)象變量,Animal是類名。上面語(yǔ)句是判定a是否可以貼Animal標(biāo)簽。如果可以貼則返回true,否則返回false。在上面的題目中: a instanceofAnimal返回 True,a instanceofDo
15、g也返回 True,instanceof用于判定是否將前面的對(duì)象變量賦值后邊的類名。Instanceof一般用于在強(qiáng)制類型轉(zhuǎn)換之前判定變量是否可以強(qiáng)制轉(zhuǎn)換。如果Animal a=new Animal();Dog d=Dog()a;此時(shí)編譯無(wú)誤,但運(yùn)行則會(huì)報(bào)錯(cuò)。Animal a=new Dog()相當(dāng)于下面語(yǔ)句的功能:Animal a=getAnimal();Public static Animal.getAnimal;Return new Dog();封裝、繼承、多態(tài)為面向?qū)ο蟮娜蠡ㄌ匦裕?。運(yùn)行時(shí)的動(dòng)態(tài)類型判定針對(duì)的是方法。運(yùn)行程序訪問的屬性仍為編譯時(shí)屬性。Overloadin
16、g針對(duì)的是編譯時(shí)類型,不存在運(yùn)行時(shí)的多態(tài)。習(xí)題:建立一個(gè)shape類,有circle和rect子類。Shape類有zhouchang()和area()兩種方法。(正方形)squ為rect子類,rect有cha()用于比較長(zhǎng)寬的差。覆蓋時(shí)考慮子類的private及父類的public(考慮多態(tài)),之所以這樣是避免調(diào)用A時(shí)出現(xiàn)實(shí)際調(diào)用B的情況。而出現(xiàn)錯(cuò)誤。11.29下午講的是教程上的Module6Module6-7包括:面向?qū)ο蟾呒?jí)、內(nèi)部類、集合、反射(暫時(shí)不講)、例外。面向?qū)ο蟾呒?jí)、集合和例外都是面向?qū)ο蟮暮诵膬?nèi)容。面向?qū)ο蟾呒?jí): 修飾符:static:可修飾變量(屬性);可修飾方法;可修飾代碼塊
17、。Staticint data語(yǔ)句說(shuō)明data為類變量,為一個(gè)類的共享變量,屬于整個(gè)類。Int data為實(shí)例變量。例:static int data;m1.data=0;m1.data+的結(jié)果為1,此時(shí)m2.data的結(jié)果也為1。Static定義的是一塊為整個(gè)類共有的一塊存儲(chǔ)區(qū)域,其發(fā)生變化時(shí)訪問到的數(shù)據(jù)都時(shí)經(jīng)過(guò)變化的。其變量可以通過(guò)類名去訪問:類名.變量名。與通過(guò)訪問對(duì)象的編譯時(shí)類型訪問類變量為等價(jià)的。Public static void printData()表明此類方法為類方法(靜態(tài)方法)靜態(tài)方法不需要有對(duì)象,可以使用類名調(diào)用。靜態(tài)方法中不允許訪問類的非靜態(tài)成員,包括成員的變量和方法,
18、因?yàn)榇藭r(shí)是通過(guò)類調(diào)用的,沒有對(duì)象的概念。This.data是不可用的。一般情況下,主方法是靜態(tài)方法,所以可調(diào)用靜態(tài)方法,主方法為靜態(tài)方法是因?yàn)樗钦麄€(gè)軟件系統(tǒng)的入口,而進(jìn)入入口時(shí)系統(tǒng)中沒有任何對(duì)象,只能使用類調(diào)用。覆蓋不適用于靜態(tài)方法。靜態(tài)方法不可被覆蓋。(允許在子類中定義同名靜態(tài)方法,但是沒有多態(tài),嚴(yán)格的講,方法間沒有多態(tài)就不能稱為覆蓋)當(dāng)static修飾代碼塊時(shí)(注:此代碼塊要在此類的任何一個(gè)方法之外),那么這個(gè)代碼塊在代碼被裝載進(jìn)虛擬機(jī)生成對(duì)象的時(shí)候可被裝載一次,以后再也不執(zhí)行了。一般靜態(tài)代碼塊被用來(lái)初始化靜態(tài)成員。Static通常用于Singleton模式開發(fā):Singleton是一種
19、設(shè)計(jì)模式,高于語(yǔ)法,可以保證一個(gè)類在整個(gè)系統(tǒng)中僅有一個(gè)對(duì)象。11.30final可以修飾類、屬性、方法。當(dāng)用final修飾類的時(shí)候,此類不可被繼承,即final類沒有子類。這樣可以用final保證用戶調(diào)用時(shí)動(dòng)作的一致性,可以防止子類覆蓋情況的發(fā)生。當(dāng)利用final修飾一個(gè)屬性(變量)的時(shí)候,此時(shí)的屬性成為常量。JAVA利用final定義常量(注意在JAVA命名規(guī)X中常量需要全部字母都大寫):Final int AGE=10;常量的地址不可改變,但在地址中保存的值(即對(duì)象的屬性)是可以改變的。Final可以配合static使用。 .Static final int age=10;在JAVA中利用
20、public static final的組合方式對(duì)常量進(jìn)行標(biāo)識(shí)(固定格式)。對(duì)于在構(gòu)造方法中利用final進(jìn)行賦值的時(shí)候,此時(shí)在構(gòu)造之前系統(tǒng)設(shè)置的默認(rèn)值相對(duì)于構(gòu)造方法失效。常量(這里的常量指的是實(shí)例常量:即成員變量)賦值:在初始化的時(shí)候通過(guò)顯式聲明賦值。Final int x=3;在構(gòu)造的時(shí)候賦值。局部變量可以隨時(shí)賦值。利用final定義方法:這樣的方法為一個(gè)不可覆蓋的方法。Public final void print();為了保證方法的一致性(即不被改變),可將方法用final定義。如果在父類中有final定義的方法,那么在子類中繼承同一個(gè)方法。如果一個(gè)方法前有修飾詞private或sta
21、tic,則系統(tǒng)會(huì)自動(dòng)在前面加上final。即private和static方法默認(rèn)均為final方法。注:final并不涉及繼承,繼承取決于類的修飾符是否為private、default、protected還是public。也就是說(shuō),是否繼承取決于這個(gè)方法對(duì)于子類是否可見。Abstract(抽象)可以修飾類、方法如果將一個(gè)類設(shè)置為abstract,則此類必須被繼承使用。此類不可生成對(duì)象,必須被繼承使用。Abstract可以將子類的共性最大限度的抽取出來(lái),放在父類中,以提高程序的簡(jiǎn)潔性。Abstract雖然不能生成對(duì)象,但是可以聲明,作為編譯時(shí)類型,但不能作為運(yùn)行時(shí)類型。Final和abstrac
22、t永遠(yuǎn)不會(huì)同時(shí)出現(xiàn)。當(dāng)abstract用于修飾方法時(shí),此時(shí)該方法為抽象方法,此時(shí)方法不需要實(shí)現(xiàn),實(shí)現(xiàn)留給子類覆蓋,子類覆蓋該方法之后方法才能夠生效。注意比較:privatevoid print();此語(yǔ)句表示方法的空實(shí)現(xiàn)。Abstract void print(); 此語(yǔ)句表示方法的抽象,無(wú)實(shí)現(xiàn)。如果一個(gè)類中有一個(gè)抽象方法,那么這個(gè)類一定為一個(gè)抽象類。反之,如果一個(gè)類為抽象類,那么其中可能有非抽象的方法。如果讓一個(gè)非抽象類繼承一個(gè)含抽象方法的抽象類,則編譯時(shí)會(huì)發(fā)生錯(cuò)誤。因?yàn)楫?dāng)一個(gè)非抽象類繼承一個(gè)抽象方法的時(shí)候,本著只有一個(gè)類中有一個(gè)抽象方法,那么這個(gè)類必須為抽象類的原則。這個(gè)類必須為抽象類,這
23、與此類為非抽象沖突,所以報(bào)錯(cuò)。所以子類的方法必須覆蓋父類的抽象方法。方法才能夠起作用。只有將理論被熟練運(yùn)用在實(shí)際的程序設(shè)計(jì)的過(guò)程中之后,才能說(shuō)理論被完全掌握!為了實(shí)現(xiàn)多態(tài),那么父類必須有定義。而父類并不實(shí)現(xiàn),留給子類去實(shí)現(xiàn)。此時(shí)可將父類定義成abstract類。如果沒有定義抽象的父類,那么編譯會(huì)出現(xiàn)錯(cuò)誤。Abstract和static不能放在一起,否則便會(huì)出現(xiàn)錯(cuò)誤。(這是因?yàn)閟tatic不可被覆蓋,而abstract為了生效必須被覆蓋。)例:(本例已存在CODINGabstractTestClass.java文件中)public class TestClass public static vo
24、id main(String args)SuperClass sc=new SubClass();Sc.print();Abstract class SuperClassAbstract void print();class SubClass extends SuperClass() void print()System.out.println(“print”);JAVA的核心概念:接口(interface)接口與類屬于同一層次,實(shí)際上,接口是一種特殊的抽象類。如:interface IApublic interface:公開接口與類相似,一個(gè)文件只能有一個(gè)public接口,且與文件名相同。在
25、一個(gè)文件中不可同時(shí)定義一個(gè)public接口和一個(gè)public類。一個(gè)接口中,所有方法為公開、抽象方法;所有的屬性都是公開、靜態(tài)、常量。一個(gè)類實(shí)現(xiàn)一個(gè)接口的格式:class IAImple implements IA;一個(gè)類實(shí)現(xiàn)接口,相當(dāng)于它繼承一個(gè)抽象類。類必須實(shí)現(xiàn)接口中的方法,否則其為一抽象類。實(shí)現(xiàn)中接口和類相同。接口中可不寫public,但在子類中實(shí)現(xiàn)接口的過(guò)程中public不可省。(如果剩去public則在編譯的時(shí)候提示出錯(cuò):對(duì)象無(wú)法從接口中實(shí)現(xiàn)方法。)注: 一個(gè)類除繼承另外一個(gè)類,還可以實(shí)現(xiàn)接口;class IAImpl extends java.util.Arrylistimplem
26、ent IA繼承類 實(shí)現(xiàn)接口這樣可以實(shí)現(xiàn)變相的多繼承。 一個(gè)類只能繼承另外一個(gè)類,但是它可以繼承多個(gè)接口,中間用“,”隔開。Implements IA,IB所謂實(shí)現(xiàn)一個(gè)接口,就是指實(shí)現(xiàn)接口中的方法。 接口和接口之間可以定義繼承關(guān)系,并且接口之間允許實(shí)現(xiàn)多繼承。例:interface IC extends IA,IB;接口也可以用于定義對(duì)象IA I=new IAImpl();實(shí)現(xiàn)的類從父類和接口繼承的都可做運(yùn)行時(shí)類型。IAImple extends A implement IA,IBIB I=new IAImple();I instance of IAImple;I instance of A;
27、I instance of IA;I instance of IB;返回的結(jié)果均為true.接口和多態(tài)都為JAVA技術(shù)的核心。接口往往被我們定義成一類XX的東西。接口實(shí)際上是定義一個(gè)規(guī)X、標(biāo)準(zhǔn)。 通過(guò)接口可以實(shí)現(xiàn)不同層次、不同體系對(duì)象的共同屬性;通過(guò)接口實(shí)現(xiàn)write once as anywhere.以JAVA數(shù)據(jù)庫(kù)連接為例子:JDBC制定標(biāo)準(zhǔn);數(shù)據(jù)廠商實(shí)現(xiàn)標(biāo)準(zhǔn);用戶使用標(biāo)準(zhǔn)。接口通常用來(lái)屏蔽底層的差異。接口也因?yàn)樯鲜鲈虮挥脕?lái)保持架構(gòu)的穩(wěn)定性。JAVA中有一個(gè)特殊的類: Object。它是JAVA體系中所有類的父類(直接父類或者間接父類)。此類中的方法可以使所的類均繼承。以下介紹的三種方法
28、屬于Object:(1) finalize方法:當(dāng)一個(gè)對(duì)象被垃圾回收的時(shí)候調(diào)用的方法。(2) toString():是利用字符串來(lái)表示對(duì)象。當(dāng)我們直接打印定義的對(duì)象的時(shí)候,隱含的是打印toString()的返回值??梢酝ㄟ^(guò)子類作為一個(gè)toString()來(lái)覆蓋父類的toString()。以取得我們想得到的表現(xiàn)形式,即當(dāng)我們想利用一個(gè)自定義的方式描述對(duì)象的時(shí)候,我們應(yīng)該覆蓋toString()。(3)equal首先試比較下例:String A=new String(“hello”);String A=new String(“hello”);A=B(此時(shí)程序返回為FALSE)因?yàn)榇藭r(shí)AB中存的是地
29、址,因?yàn)閯?chuàng)建了新的對(duì)象,所以存放的是不同的地址。附加知識(shí):字符串類為JAVA中的特殊類,String中為final類,一個(gè)字符串的值不可重復(fù)。因此在JAVA VM(虛擬機(jī))中有一個(gè)字符串池,專門用來(lái)存儲(chǔ)字符串。如果遇到String a=”hello”時(shí)(注意沒有NEW,不是創(chuàng)建新串),系統(tǒng)在字符串池中尋找是否有”hello”,此時(shí)字符串池中沒有”hello”,那么系統(tǒng)將此字符串存到字符串池中,然后將”hello”在字符串池中的地址返回a。如果系統(tǒng)再遇到String b=”hello”,此時(shí)系統(tǒng)可以在字符串池中找到 “hello”。則會(huì)把地址返回b,此時(shí)a與b為相同。String a=
30、”hello”;System.out.println(a=”hello”);系統(tǒng)的返回值為true。故如果要比較兩個(gè)字符串是否相同(而不是他們的地址是否相同)。可以對(duì)a調(diào)用equal:System.out.println(a.equal(b);equal用來(lái)比較兩個(gè)對(duì)象中字符串的順序。a.equal(b)是a與b的值的比較。注意下面程序:student a=new student(“LUCY”,20);student b=new student(“LUCY”,20);System.out.println(a=b);System.out.println(a.equal(b);此時(shí)返回的結(jié)果均為f
31、alse。以下為定義equal(加上這個(gè)定義,返回ture或false)public boolean equals(Object o) student s=(student)o; if (.equals()&&s.age=this.age)else return false;如果equals()返回的值為以下為實(shí)現(xiàn)標(biāo)準(zhǔn)equals的流程:public boolean equals(Object o) if (this=o) return trun; /此時(shí)兩者相同 if (o=null) return false; if (! o instance
32、of strudent) return false; /不同類 studeng s=(student)o; /強(qiáng)制轉(zhuǎn)換if (.equals()&&s.age=this.age) return true;else return false;以上過(guò)程為實(shí)現(xiàn)equals的標(biāo)準(zhǔn)過(guò)程。練習(xí):建立一個(gè)employee類,有String name,int id,double salary.運(yùn)用get和set方法,使用toString,使用equals。封裝類:JAVA為每一個(gè)簡(jiǎn)單數(shù)據(jù)類型提供了一個(gè)封裝類,使每個(gè)簡(jiǎn)單數(shù)據(jù)類型可以被Object來(lái)裝載。除了int和
33、char,其余類型首字母大寫即成封裝類。轉(zhuǎn)換字符的方式:int I=10;String s=I+” ”;String s1=String.valueOf(i);Int I=10;Interger I_class=new integer(I);看javadoc的幫助文檔。附加內(nèi)容:“=”在任何時(shí)候都是比較地址,這種比較永遠(yuǎn)不會(huì)被覆蓋。程序員自己編寫的類和JDK類是一種合作關(guān)系。(因?yàn)槎鄳B(tài)的存在,可能存在我們調(diào)用JDK類的情況,也可能存在JDK自動(dòng)調(diào)用我們的類的情況。)注意:類型轉(zhuǎn)換中doubleintergerstring之間的轉(zhuǎn)換最多。12.01內(nèi)部類:(注:所有使用內(nèi)部類的地方都可以不用內(nèi)部
34、類,使用內(nèi)部類可以使程序更加的簡(jiǎn)潔,便于命名規(guī)X和劃分層次結(jié)構(gòu))。內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。內(nèi)部類作為外部類的一個(gè)成員,并且依附于外部類而存在的。內(nèi)部類可為靜態(tài),可用PROTECTED和PRIVATE修飾。(而外部類不可以:外部類只能使用PUBLIC和DEFAULT)。內(nèi)部類的分類:成員內(nèi)部類、局部?jī)?nèi)部類、靜態(tài)內(nèi)部類、匿名內(nèi)部類(圖形是要用到,必須掌握)。 成員內(nèi)部類:作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列。內(nèi)部類和外部類的實(shí)例變量可以共存。在內(nèi)部類中訪問實(shí)例變量:this.屬性在內(nèi)部類訪問外部類的實(shí)例變量:外部類名.this.屬性。成員內(nèi)部類的優(yōu)點(diǎn):內(nèi)部類作為外部
35、類的成員,可以訪問外部類的私有成員或?qū)傩?。(即使將外部類聲明為PRIVATE,但是對(duì)于處于其內(nèi)部的內(nèi)部類還是可見的。)用內(nèi)部類定義在外部類中不可訪問的屬性。這樣就在外部類中實(shí)現(xiàn)了比外部類的private還要小的訪問權(quán)限。注意:內(nèi)部類是一個(gè)編譯時(shí)的概念,一旦編譯成功,就會(huì)成為完全不同的兩類。對(duì)于一個(gè)名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。(編寫一個(gè)程序檢驗(yàn):在一個(gè)TestOuter.java程序中驗(yàn)證內(nèi)部類在編譯完成之后,會(huì)出現(xiàn)幾個(gè)class.)成員內(nèi)部類不可以有靜態(tài)屬性。(為什么.)如果在外部類的
36、外部訪問內(nèi)部類,使用out.inner.建立內(nèi)部類對(duì)象時(shí)應(yīng)注意:在外部類的內(nèi)部可以直接使用inner s=new inner();(因?yàn)橥獠款愔纈nner是哪個(gè)類,所以可以生成對(duì)象。)而在外部類的外部,要生成(new)一個(gè)內(nèi)部類對(duì)象,需要首先建立一個(gè)外部類對(duì)象(外部類可用),然后在生成一個(gè)內(nèi)部類對(duì)象。Outer.Inner in=Outer.new.Inner()。錯(cuò)誤的定義方式:Outer.Inner in=new Outer.Inner()。注意:當(dāng)Outer是一個(gè)private類時(shí),外部類對(duì)于其外部訪問是私有的,所以就無(wú)法建立外部類對(duì)象,進(jìn)而也無(wú)法建立內(nèi)部類對(duì)象。 局部?jī)?nèi)部類:在方法中
37、定義的內(nèi)部類稱為局部?jī)?nèi)部類。與局部變量類似,在局部?jī)?nèi)部類前不加修飾符public和private,其X圍為定義它的代碼塊。注意:局部?jī)?nèi)部類不僅可以訪問外部類實(shí)例變量,還可以訪問外部類的局部變量(但此時(shí)要求外部類的局部變量必須為final).在類外不可直接生成局部?jī)?nèi)部類(保證局部?jī)?nèi)部類對(duì)外是不可見的)。要想使用局部?jī)?nèi)部類時(shí)需要生成對(duì)象,對(duì)象調(diào)用方法,在方法中才能調(diào)用其局部?jī)?nèi)部類。 靜態(tài)內(nèi)部類:(注意:前三種內(nèi)部類與變量類似,所以可以對(duì)照參考變量)靜態(tài)內(nèi)部類定義在類中,任何方法外,用static定義。靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員。生成(new)一個(gè)靜態(tài)內(nèi)部類不需要外部類成員:這是靜態(tài)內(nèi)部類和
38、成員內(nèi)部類的區(qū)別。靜態(tài)內(nèi)部類的對(duì)象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通過(guò)生成外部類對(duì)象來(lái)生成。這樣實(shí)際上使靜態(tài)內(nèi)部類成為了一個(gè)頂級(jí)類。靜態(tài)內(nèi)部類不可用private來(lái)進(jìn)行定義。例子:對(duì)于兩個(gè)類,擁有相同的方法:People run();Machine run();此時(shí)有一個(gè)robot類:class Robot extends People implement Machine.此時(shí)run()不可直接實(shí)現(xiàn)。注意:當(dāng)類與接口(或者是接口與接口)發(fā)生方法命名沖突的時(shí)候,此時(shí)必須使用內(nèi)部類來(lái)實(shí)現(xiàn)。用接口不能完全地實(shí)現(xiàn)多繼承,用接口配合內(nèi)部類才能實(shí)現(xiàn)真
39、正的多繼承。 匿名內(nèi)部類(必須掌握):匿名內(nèi)部類是一種特殊的局部?jī)?nèi)部類,它是通過(guò)匿名類實(shí)現(xiàn)接口。IA被定義為接口。IA I=new IA();注:一個(gè)匿名內(nèi)部類一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類,沒有類名,根據(jù)多態(tài),我們使用其父類名。因其為局部?jī)?nèi)部類,那么局部?jī)?nèi)部類的所有限制都對(duì)其生效。匿名內(nèi)部類是唯一一種無(wú)構(gòu)造方法類。匿名內(nèi)部類在編譯的時(shí)候由系統(tǒng)自動(dòng)起名Out$1.class。如果一個(gè)對(duì)象編譯時(shí)的類型是接口,那么其運(yùn)行的類型為實(shí)現(xiàn)這個(gè)接口的類。因匿名內(nèi)部類無(wú)構(gòu)造方法,所以其使用X圍非常的有限。(下午:)Exception(例外/異常)(教程上的MODEL7)對(duì)于程序可能出
40、現(xiàn)的錯(cuò)誤應(yīng)該做出預(yù)案。例外是程序中所有出乎意料的結(jié)果。(關(guān)系到系統(tǒng)的健壯性)JAVA會(huì)將所有的錯(cuò)誤封裝成為一個(gè)對(duì)象,其根本父類為Throwable。Throwable有兩個(gè)子類: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對(duì)象中只有Exception對(duì)象(例外/異常)。Exception有兩個(gè)子類:Runtime exception(未檢查異常)非Runti
41、me exception(已檢查異常)(注意:無(wú)論是未檢查異常還是已檢查異常在編譯的時(shí)候都不會(huì)被發(fā)現(xiàn),在編譯的過(guò)程中檢查的是程序的語(yǔ)法錯(cuò)誤,而異常是一個(gè)運(yùn)行時(shí)程序出錯(cuò)的概念。)在Exception中,所有的非未檢查異常都是已檢查異常,沒有另外的異常!未檢查異常是因?yàn)槌绦騿T沒有進(jìn)行必要的檢查,因?yàn)樗氖韬龊湾e(cuò)誤而引起的異常。一定是屬于虛擬機(jī)內(nèi)部的異常(比如空指針)。應(yīng)對(duì)未檢查異常就是養(yǎng)成良好的檢查習(xí)慣。已檢查異常是不可避免的,對(duì)于已檢查異常必須實(shí)現(xiàn)定義好應(yīng)對(duì)的方法。已檢查異??隙缭匠隽颂摂M機(jī)的X圍。(比如“未找到文件”)如何處理已檢查異常(對(duì)于所有的已檢查異常都要進(jìn)行處理):首先了解異常形成的
42、機(jī)制:當(dāng)一個(gè)方法中有一條語(yǔ)句出現(xiàn)了異常,它就會(huì)throw(拋出)一個(gè)例外對(duì)象,然后后面的語(yǔ)句不會(huì)執(zhí)行返回上一級(jí)方法,其上一級(jí)方法接受到了例外對(duì)象之后,有可能對(duì)這個(gè)異常進(jìn)行處理,也可能將這個(gè)異常轉(zhuǎn)到它的上一級(jí)。對(duì)于接收到的已檢查異常有兩種處理方式:throws和try方法。注意:出錯(cuò)的方法有可能是JDK,也可能是程序員寫的程序,無(wú)論誰(shuí)寫的,拋出一定用throw。例:public void print() throws Exception.對(duì)于方法a,如果它定義了throwsException。那么當(dāng)它調(diào)用的方法b返回異常對(duì)象時(shí),方法a并不處理,而將這個(gè)異常對(duì)象向上一級(jí)返回,如果所有的方法均不進(jìn)行
43、處理,返回到主方法,程序中止。(要避免所有的方法都返回的使用方法,因?yàn)檫@樣出現(xiàn)一個(gè)很小的異常就會(huì)令程序中止)。如果在方法的程序中有一行throw new Exception(),返回錯(cuò)誤,那么其后的程序不執(zhí)行。因?yàn)殄e(cuò)誤返回后,后面的程序肯定沒有機(jī)會(huì)執(zhí)行,那么JAVA認(rèn)為以后的程序沒有存在的必要。對(duì)于trycatch格式:try 可能出現(xiàn)錯(cuò)誤的代碼塊catch(exception e)進(jìn)行處理的代碼; 對(duì)象變量的聲明用這種方法,如果代碼正確,那么程序不經(jīng)過(guò)catch語(yǔ)句直接向下運(yùn)行;如果代碼不正確,則將返回的異常對(duì)象和e進(jìn)行匹配,如果匹配成功,則處理其后面的異常處理代碼。(如果用exceptio
44、n來(lái)聲明e的話,因?yàn)閑xception為所有exception對(duì)象的父類,所有肯定匹配成功)。處理完代碼后這個(gè)例外就完全處理完畢,程序會(huì)接著從出現(xiàn)異常的地方向下執(zhí)行(是從出現(xiàn)異常的地方還是在catch后面呢.利用程序進(jìn)行驗(yàn)證)。最后程序正常退出。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編
45、譯出錯(cuò)。在try,catch后還可以再跟一子句finally。其中的代碼語(yǔ)句無(wú)論如何都會(huì)被執(zhí)行(因?yàn)閒inally子句的這個(gè)特性,所以一般將釋放資源,關(guān)閉連接的語(yǔ)句寫在里面)。如果在程序中書寫了檢查(拋出)exception但是沒有對(duì)這個(gè)可能出現(xiàn)的檢查結(jié)果進(jìn)行處理,那么程序就會(huì)報(bào)錯(cuò)。而如果只有處理情況(try)而沒有相應(yīng)的catch子句,則編譯還是通不過(guò)。如何知道在編寫的程序中會(huì)出現(xiàn)例外呢1 調(diào)用方法,查看API中查看方法中是否有已檢查錯(cuò)誤。2 在編譯的過(guò)程中看提示信息,然后加上相應(yīng)的處理。Exception有一個(gè)message屬性。在使用catch的時(shí)候可以調(diào)用:Catch(IOExcept
46、ion e)System.out.println(e.message();Catch(IOException e)e.printStackTrace();上面這條語(yǔ)句回告訴我們出錯(cuò)類型所歷經(jīng)的過(guò)程,在調(diào)試的中非常有用。開發(fā)中的兩個(gè)道理:如何控制try的X圍:根據(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(積極)和try catch(消極)兩種處理方法。對(duì)于try catch放在能夠很好地處理例外的位置(即放在具備對(duì)例外進(jìn)行處理的能力的位置)。如果沒有處理能力就繼
47、續(xù)上拋。當(dāng)我們自己定義一個(gè)例外類的時(shí)候必須使其繼承excepiton或者RuntimeException。Throw是一個(gè)語(yǔ)句,用來(lái)做拋出例外的功能。而throws是表示如果下級(jí)方法中如果有例外拋出,那么本方法不做處理,繼續(xù)向上拋出。Throws后跟的是例外類型。斷言是一種調(diào)試工具(assert)其后跟的是布爾類型的表達(dá)式,如果表達(dá)式結(jié)果為真不影響程序運(yùn)行。如果為假系統(tǒng)出現(xiàn)低級(jí)錯(cuò)誤,在屏幕上出現(xiàn)assert信息。Assert只是用于調(diào)試。在產(chǎn)品編譯完成后上線assert代碼就被刪除了。方法的覆蓋中,如果子類的方法拋出的例外是父類方法拋出的例外的父類型,那么編譯就會(huì)出錯(cuò):子類無(wú)法覆蓋父類。結(jié)論:
48、子類方法不可比父類方法拋出更多的例外。子類拋出的例外或者與父類拋出的例外一致,或者是父類拋出例外的子類型。或者子類型不拋出例外。如果父類型無(wú)throws時(shí),子類型也不允許出現(xiàn)throws。此時(shí)只能使用try catch。練習(xí):寫一個(gè)方法:int add(int a,int b) return a+b;當(dāng)a+b=100;拋出100為異常處理。12.02集合(從本部分開始涉及API)集合是指一個(gè)對(duì)象容納了多個(gè)對(duì)象,這個(gè)集合對(duì)象主要用來(lái)管理維護(hù)一系列相似的對(duì)象。數(shù)組就是一種對(duì)象。(練習(xí):如何編寫一個(gè)數(shù)組程序,并進(jìn)行遍歷。)java.util.*定義了一系列的接口和類,告訴我們用什么類NEW出一個(gè)對(duì)象
49、,可以進(jìn)行超越數(shù)組的操作。(注:JAVA1.5對(duì)JAVA1.4的最大改進(jìn)就是增加了對(duì)X型的支持)集合框架接口的分類:(分collection接口 和 map接口)Collection接口 Map接口List接口 Set接口 SortedMap接口SortedSet接口JAVA中所有與集合有關(guān)的實(shí)現(xiàn)類都是這六個(gè)接口的實(shí)現(xiàn)類。Collection接口:集合中每一個(gè)元素為一個(gè)對(duì)象,這個(gè)接口將這些對(duì)象組織在一起,形成一維結(jié)構(gòu)。List接口代表按照元素一定的相關(guān)順序來(lái)組織(在這個(gè)序列中順序是主要的),List接口中數(shù)據(jù)可重復(fù)。Set接口是數(shù)學(xué)中集合的概念:其元素?zé)o序,且不可重復(fù)。(正好與List對(duì)應(yīng))S
50、ortedSet會(huì)按照數(shù)字將元素排列,為“可排序集合”。Map接口中每一個(gè)元素不是一個(gè)對(duì)象,而是一個(gè)鍵對(duì)象和值對(duì)象組成的鍵值對(duì)(Key-Value)。Key-Value是用一個(gè)不可重復(fù)的key集合對(duì)應(yīng)可重復(fù)的value集合。(典型的例子是字典:通過(guò)頁(yè)碼的key值找字的value值)。例子:key1value1;key2value2;key3value3.SortedMap:如果一個(gè)Map可以根據(jù)key值排序,則稱其為SortedMap。(如字典)!注意數(shù)組和集合的區(qū)別:數(shù)組中只能存簡(jiǎn)單數(shù)據(jù)類型。Collection接口和Map接口只能存對(duì)象。以下介紹接口:List接口:(介紹其下的兩個(gè)實(shí)現(xiàn)類:
51、ArrayList和LinkedList)ArrayList和數(shù)組非常類似,其底層也用數(shù)組組織數(shù)據(jù),ArrayList是動(dòng)態(tài)可變數(shù)組。 底層:指存儲(chǔ)格式。說(shuō)明ArrayList對(duì)象都是存在于數(shù)組中。注:數(shù)組和集合都是從下標(biāo)0開始。ArrayList有一個(gè)add(Object o)方法用于插入數(shù)組。ArrayList的使用:(完成這個(gè)程序)先import java.util.*;用ArrayList在一個(gè)數(shù)組中添加數(shù)據(jù),并遍歷。ArrayList中數(shù)組的順序與添加順序一致。只有List可用get和size。而Set則不可用(因其無(wú)序)。Collection接口都是通過(guò)Iterator()(即迭代
52、器)來(lái)對(duì)Set和List遍歷。通過(guò)語(yǔ)句:Iterator it=c.iterator(); 得到一個(gè)迭代器,將集合中所有元素順序排列。然后可以通過(guò)interator方法進(jìn)行遍歷,迭代器有一個(gè)游標(biāo)(指針)指向首位置。Interator有hasNext(),用于判斷元素右邊是否還有數(shù)據(jù),返回True說(shuō)明有。然后就可以調(diào)用next動(dòng)作。Next()會(huì)將游標(biāo)移到下一個(gè)元素,并把它所跨過(guò)的元素返回。(這樣就可以對(duì)元素進(jìn)行遍歷)練習(xí):寫一個(gè)程序,輸入對(duì)象信息,比較基本信息。集合中每一個(gè)元素都有對(duì)象,如有字符串要經(jīng)過(guò)強(qiáng)制類型轉(zhuǎn)換。Collections是工具類,所有方法均為有用方法,且方法為static。有
53、Sort方法用于給List排序。Collections.Sort()分為兩部分,一部分為排序規(guī)則;一部分為排序算法。規(guī)則用來(lái)判斷對(duì)象;算法是考慮如何排序。對(duì)于自定義對(duì)象,Sort不知道規(guī)則,所以無(wú)法比較。這種情況下一定要定義排序規(guī)則。方式有兩種: java.lang下面有一個(gè)接口:parable(可比較的)可以讓自定義對(duì)象實(shí)現(xiàn)一個(gè)接口,這個(gè)接口只有一個(gè)方法parableTo(Object o)其規(guī)則是當(dāng)前對(duì)象與o對(duì)象進(jìn)行比較,其返回一個(gè)int值,系統(tǒng)根據(jù)此值來(lái)進(jìn)行排序。如 當(dāng)前對(duì)象>o對(duì)象,則返回值>0;(可將返回值定義為1)如 當(dāng)前對(duì)象=o對(duì)象,則返回值=0;如 當(dāng)前對(duì)象<
54、o對(duì)象,則返回值0。(可將返回值定義為-1)看TestArraylist的java代碼。我們通過(guò)返回值1和-1位置的調(diào)換來(lái)實(shí)現(xiàn)升序和降序排列的轉(zhuǎn)換。 java.util下有一個(gè)parator(比較器)它擁有pare(),用來(lái)比較兩個(gè)方法。要生成比較器,則用Sort中Sort(List,List(pate))第二種方法更靈活,且在運(yùn)行的時(shí)候不用編譯。注意:要想實(shí)現(xiàn)parTo()就必須在主方法中寫上implementparable.練習(xí):生成一個(gè)EMPLOYEE類,然后將一系列對(duì)象放入到ArrayList。用Iterator遍歷,排序之后,再進(jìn)行遍歷。集合的最大缺點(diǎn)是無(wú)法進(jìn)行類型判定(這個(gè)缺點(diǎn)在J
55、AVA1.5中已經(jīng)解決),這樣就可能出現(xiàn)因?yàn)轭愋筒煌霈F(xiàn)類型錯(cuò)誤。解決的方法是添加類型的判斷。LinkedList接口(在代碼的使用過(guò)程中和ArrayList沒有什么區(qū)別)ArrayList底層是object數(shù)組,所以ArrayList具有數(shù)組的查詢速度快的優(yōu)點(diǎn)以及增刪速度慢的缺點(diǎn)。而在LinkedList的底層是一種雙向循環(huán)鏈表。在此鏈表上每一個(gè)數(shù)據(jù)節(jié)點(diǎn)都由三部分組成:前指針(指向前面的節(jié)點(diǎn)的位置),數(shù)據(jù),后指針(指向后面的節(jié)點(diǎn)的位置)。最后一個(gè)節(jié)點(diǎn)的后指針指向第一個(gè)節(jié)點(diǎn)的前指針,形成一個(gè)循環(huán)。雙向循環(huán)鏈表的查詢效率低但是增刪效率高。所以LinkedList具有查詢效率低但增刪效率高的特點(diǎn)。ArrayList和LinkedList在用法上沒有區(qū)別,但是在功能上還是有區(qū)別的。LinkedList經(jīng)常用在增刪操作較多而查詢操作很少的情況下:隊(duì)列和堆棧。隊(duì)列:先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。堆棧:后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。注意:使用堆棧的時(shí)候一定不能提供方法讓不是最后一個(gè)元素的元素獲得出棧的機(jī)會(huì)。LinkedList提供以下方法:(ArrayList無(wú)此類方法)addFirst()
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車行業(yè)深度:汽車板塊24Q3財(cái)報(bào)綜述乘用車板塊景氣向上量利齊升
- 中等教育質(zhì)量評(píng)估與監(jiān)測(cè)考核試卷
- 建筑物拆除的施工消防安全考核試卷
- 林果場(chǎng)租用協(xié)議
- 油氣管道新建爆破作業(yè)協(xié)議
- 電動(dòng)車租賃長(zhǎng)期合作協(xié)議
- 水土保持套筒連接施工合同
- 商業(yè)店鋪大理石鋪設(shè)合同
- 地下礦井司機(jī)勞動(dòng)合同范本
- 物聯(lián)網(wǎng)產(chǎn)品介紹
- 螺栓檢測(cè)報(bào)告
- 碳排放介紹及相關(guān)計(jì)算方法
- 社團(tuán)活動(dòng)記錄(足球)
- 腐蝕測(cè)量及技術(shù)
- 家庭醫(yī)生簽約服務(wù)在實(shí)施老年高血壓患者社區(qū)護(hù)理管理中應(yīng)用
- 氯化鈉與氯化銨分離解析
- 關(guān)注青少年心理健康孩子的人格培養(yǎng)與家庭教育
- 個(gè)案面談技巧(2016.6.15)
- 高中理科教學(xué)儀器配備標(biāo)準(zhǔn)[共121頁(yè)]
- 屋面平瓦(掛瓦條鋪瓦)施工方案
- 【醫(yī)學(xué)】crrt規(guī)范化治療
評(píng)論
0/150
提交評(píng)論