Java學(xué)習(xí)筆記(必看經(jīng)典).doc_第1頁(yè)
Java學(xué)習(xí)筆記(必看經(jīng)典).doc_第2頁(yè)
Java學(xué)習(xí)筆記(必看經(jīng)典).doc_第3頁(yè)
Java學(xué)習(xí)筆記(必看經(jīng)典).doc_第4頁(yè)
Java學(xué)習(xí)筆記(必看經(jīng)典).doc_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

誠(chéng)信、創(chuàng)新、開(kāi)放、合作JAVA的面向?qū)ο缶幊?課堂筆記面向?qū)ο笾饕槍?duì)面向過(guò)程。面向過(guò)程的基本單元是函數(shù)。什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物皆對(duì)象)所有的事物都有兩個(gè)方面:有什么(屬性):用來(lái)描述對(duì)象。能夠做什么(方法):告訴外界對(duì)象有那些功能。后者以前者為基礎(chǔ)。大的對(duì)象的屬性也可以是一個(gè)對(duì)象。為什么要使用面向?qū)ο螅菏紫?,面向?qū)ο蠓先祟?lèi)看待事物的一般規(guī)律。對(duì)象的方法的實(shí)現(xiàn)細(xì)節(jié)是屏蔽的,只有對(duì)象方法的實(shí)現(xiàn)者了解細(xì)節(jié)。方法的定義非常重要。方法有參數(shù),也可能有返回值。注意區(qū)分:對(duì)象(本身)、對(duì)象的實(shí)現(xiàn)者、對(duì)象的調(diào)用者。分析對(duì)象主要從方法開(kāi)始。我們通過(guò)類(lèi)來(lái)看待對(duì)象,類(lèi)是對(duì)象的抽象。其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職、各盡所能。對(duì)象之間的耦合性一定要低(比如不同硬盤(pán)和不同主板之間的關(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ì)象為中心,先開(kāi)發(fā)類(lèi),得到對(duì)象,通過(guò)對(duì)象之間相互通信實(shí)現(xiàn)功能。面向過(guò)程是先有算法,后有數(shù)據(jù)結(jié)構(gòu)。面向?qū)ο笫窍扔袛?shù)據(jù)結(jié)構(gòu),然后再有算法。在用面向?qū)ο笏枷腴_(kāi)發(fā)的過(guò)程中,可以復(fù)用對(duì)象就進(jìn)行復(fù)用,如無(wú)法進(jìn)行復(fù)用則開(kāi)發(fā)新的對(duì)象。開(kāi)發(fā)過(guò)程是用對(duì)個(gè)簡(jiǎn)單的對(duì)象的多個(gè)簡(jiǎn)單的方法,來(lái)實(shí)現(xiàn)復(fù)雜的功能 。從語(yǔ)法上來(lái)看,一個(gè)類(lèi)是一個(gè)新的數(shù)據(jù)類(lèi)型。在面向?qū)ο缶幊讨校撕?jiǎn)單數(shù)據(jù)類(lèi)型,就是對(duì)象類(lèi)型。定義類(lèi)的格式:class Student 代碼注意類(lèi)名中單詞的首字母大寫(xiě)。實(shí)例變量:定義在類(lèi)中但在任何方法之外。(New出來(lái)的均有初值)局部變量:定義在方法之中的變量。局部變量要先賦值,再進(jìn)行運(yùn)算,而實(shí)例變量均已經(jīng)賦初值。這是局部變量和實(shí)例變量的一大區(qū)別。實(shí)例變量的對(duì)象賦值為null。局部變量不允許范圍內(nèi)定義兩個(gè)同名變量。實(shí)例變量的作用域在本類(lèi)中完全有效,當(dāng)被其他的類(lèi)調(diào)用的時(shí)候也可能有效。實(shí)例變量和局部變量允許命名沖突。書(shū)寫(xiě)方法的格式:修飾符 返回值 方法名 調(diào)用過(guò)程中 方法體可能出現(xiàn)的例外 public int/void addNumber(參數(shù)) throw Excepion 例:public int addNumber(int a,int b)注:方法名中的參數(shù)int a,int b為局部變量類(lèi)方法中的一類(lèi)特殊方法:構(gòu)造方法。構(gòu)造方法是當(dāng)用類(lèi)生成對(duì)象時(shí),系統(tǒng)在生成對(duì)象的過(guò)程中利用的方法。注意:構(gòu)造方法在生成對(duì)象的時(shí)候會(huì)被調(diào)用,但并不是構(gòu)造方法生成了對(duì)象。構(gòu)造方法沒(méi)有返回值。格式為:public 方法名。構(gòu)造方法的方法名與類(lèi)名相同。構(gòu)造方法是在對(duì)象生成的過(guò)程中自動(dòng)調(diào)用,不可能利用指令去調(diào)用。在一個(gè)對(duì)象的生成周期中構(gòu)造方法只用一次,一旦這個(gè)對(duì)象生成,那么這個(gè)構(gòu)造方法失效。用類(lèi)來(lái)生成對(duì)象的語(yǔ)句:Student s=new Student()。第一個(gè)Student表示這是用Student類(lèi)進(jìn)行定義?!癝tudent()”表示調(diào)用一個(gè)無(wú)參數(shù)的構(gòu)造方法。如果()中有參數(shù),則系統(tǒng)構(gòu)造對(duì)象的過(guò)程中調(diào)用有參的方法。此時(shí)S稱(chēng)為一個(gè)對(duì)象變量。Student s的存儲(chǔ)區(qū)域存放的是地址:一個(gè)對(duì)象在硬盤(pán)上占有一個(gè)連續(xù)地址,首地址賦予s空間。S稱(chēng)為對(duì)象Student的引用。注意:在對(duì)象變量中存放的是引用(地址);在簡(jiǎn)單變量中存放的是數(shù)值??梢詷?gòu)造多個(gè)構(gòu)造方法,但多個(gè)構(gòu)造方法的參數(shù)表一定不同,參數(shù)順序不同即屬于不同的構(gòu)造方法:public 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í):寫(xiě)一個(gè)類(lèi),定義一個(gè)對(duì)象,定義兩個(gè)構(gòu)造方法:一個(gè)有參,一個(gè)無(wú)參。(編寫(xiě)一個(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)。在有些JAVA書(shū)籍中將overriding稱(chēng)為重載,overloading稱(chēng)為過(guò)載。Overloading在一個(gè)類(lèi)中可以定義多個(gè)同名方法,各個(gè)方法的參數(shù)表一定不同。但修飾詞可能相同,返回值也可能相同。在程序的編譯過(guò)程中根據(jù)變量類(lèi)型來(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)型的差異來(lái)影響對(duì)方法的調(diào)用。吃()可以分為吃肉,吃菜,吃藥,在一個(gè)類(lèi)中可以定義多個(gè)吃方法。構(gòu)造方法也可以實(shí)現(xiàn)overloading。例:public void teach();public void teach(int a);public void teach(String a)為三種不同的方法。Overloading方法是從低向高轉(zhuǎn)。Byteshortfloatintlongdouble。在構(gòu)造方法中,this表示本類(lèi)的其他構(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.println(this.number); 此時(shí)打印的是實(shí)例變量,而非局部變量,即定義在類(lèi)中而非方法中的變量。This.number表示實(shí)例變量。誰(shuí)調(diào)用this.number那么誰(shuí)即為當(dāng)前(this)對(duì)象的number方法。封裝:使對(duì)象的屬性盡可能私有,對(duì)象的方法盡可能的公開(kāi)。用private表示此成員屬性為該類(lèi)的私有屬性。Public表示該屬性(方法)公開(kāi);Private表示該屬性(方法)為只有本類(lèi)內(nèi)部可以訪問(wèn)(類(lèi)內(nèi)部可見(jiàn))。(想用private還要用set和get方法供其他方法調(diào)用,這樣可以保證對(duì)屬性的訪問(wèn)方式統(tǒng)一,并且便于維護(hù)訪問(wèn)權(quán)限以及屬性數(shù)據(jù)合法性)如果沒(méi)有特殊情況,屬性一定私有,方法該公開(kāi)的公開(kāi)。如果不指明誰(shuí)調(diào)用方法,則默認(rèn)為this。區(qū)分實(shí)例變量和局部變量時(shí)一定要寫(xiě)this。11.29繼承:父類(lèi)(SuperClass)和 子類(lèi)(SonClass)。父類(lèi)的非私有化屬性和方法可以默認(rèn)繼承到子類(lèi)。Class Son extends Father而如果父類(lèi)中的私有方法被子類(lèi)調(diào)用的話,則編譯報(bào)錯(cuò)。父類(lèi)的構(gòu)造方法子類(lèi)不可以繼承,更不存在覆蓋的問(wèn)題。(非構(gòu)造方法可以)如果子類(lèi)訪問(wèn)父類(lèi)的構(gòu)造方法,則在編譯的時(shí)候提示訪問(wèn)不到該方法。JAVA中不允許多繼承,一個(gè)類(lèi)有且只有一個(gè)父類(lèi)(單繼承)。JAVA的數(shù)據(jù)結(jié)構(gòu)為樹(shù)型結(jié)構(gòu),而非網(wǎng)狀。(JAVA通過(guò)接口和內(nèi)部類(lèi)實(shí)現(xiàn)多繼承)方法的覆蓋(overriding)方法的重載并不一定是在一個(gè)類(lèi)中:子類(lèi)可以從父類(lèi)繼承一個(gè)方法,也可以定義一個(gè)同名異參的方法,也稱(chēng)為overloading。當(dāng)子類(lèi)從父類(lèi)繼承一個(gè)無(wú)參方法,而又定義了一個(gè)同樣的無(wú)參方法,則子類(lèi)新寫(xiě)的方法覆蓋父類(lèi)的方法,稱(chēng)為覆蓋。(注意返回值類(lèi)型也必須相同,否則編譯出錯(cuò)。)如果方法不同,則成重載。對(duì)于方法的修飾詞,子類(lèi)方法要比父類(lèi)的方法范圍更加的寬泛。父類(lèi)為public,那么子類(lèi)為private則出現(xiàn)錯(cuò)誤。之所以構(gòu)造方法先運(yùn)行父類(lèi)再運(yùn)行子類(lèi)是因?yàn)闃?gòu)造方法是無(wú)法覆蓋的。以下范圍依次由嚴(yán)到寬:private :本類(lèi)訪問(wèn);default :表示默認(rèn),不僅本類(lèi)訪問(wèn),而且是同包可見(jiàn)。Protected:同包可見(jiàn)+不同包的子類(lèi)可見(jiàn)Public :表示所有的地方均可見(jiàn)。當(dāng)構(gòu)造一個(gè)對(duì)象的時(shí)候,系統(tǒng)先構(gòu)造父類(lèi)對(duì)象,再構(gòu)造子類(lèi)對(duì)象。構(gòu)造一個(gè)對(duì)象的順序:(注意:構(gòu)造父類(lèi)對(duì)象的時(shí)候也是這幾步) 遞歸地構(gòu)造父類(lèi)對(duì)象; 順序地調(diào)用本類(lèi)成員屬性賦初值語(yǔ)句; 本類(lèi)的構(gòu)造方法。Super()表示調(diào)用父類(lèi)的構(gòu)造方法。Super()也和this一樣必須放在第一行。This()用于調(diào)用本類(lèi)的構(gòu)造方法。如果沒(méi)有定義構(gòu)造方法,那么就會(huì)調(diào)用父類(lèi)的無(wú)參構(gòu)造方法,即super()。要養(yǎng)成良好的編程習(xí)慣:就是要加上默認(rèn)的父類(lèi)無(wú)參的構(gòu)造方法。思考:可是如果我們沒(méi)有定義無(wú)參的構(gòu)造方法,而在程序中構(gòu)造了有參的構(gòu)造方法,那么如果方法中沒(méi)有參數(shù),那么系統(tǒng)還會(huì)調(diào)用有參的構(gòu)造方法么?應(yīng)該不會(huì)。多態(tài):多態(tài)指的是編譯時(shí)類(lèi)型變化,而運(yùn)行時(shí)類(lèi)型不變。多態(tài)分兩種: 編譯時(shí)多態(tài):編譯時(shí)動(dòng)態(tài)重載; 運(yùn)行時(shí)多態(tài):指一個(gè)對(duì)象可以具有多個(gè)類(lèi)型。對(duì)象是客觀的,人對(duì)對(duì)象的認(rèn)識(shí)是主觀的。例:Animal a=new Dog();查看格式名稱(chēng);Dog d=(Dog)a。聲明父類(lèi)來(lái)引用子類(lèi)。(思考上面的格式)運(yùn)行時(shí)多態(tài)的三原則:(應(yīng)用時(shí)為覆蓋)1、 對(duì)象不變;(改變的是主觀認(rèn)識(shí))2、 對(duì)于對(duì)象的調(diào)用只能限于編譯時(shí)類(lèi)型的方法,如調(diào)用運(yùn)行時(shí)類(lèi)型方法報(bào)錯(cuò)。在上面的例子中:Animal a=new Dog();對(duì)象a的編譯時(shí)類(lèi)型為Animal,運(yùn)行時(shí)類(lèi)型為dog。注意:編譯時(shí)類(lèi)型一定要為運(yùn)行時(shí)類(lèi)型的父類(lèi)(或者同類(lèi)型)。對(duì)于語(yǔ)句:Dog d=(Dog)a。將d強(qiáng)制聲明為a類(lèi)型,此時(shí)d為Dog(),此時(shí)d就可以調(diào)用運(yùn)行時(shí)類(lèi)型。注意:a和d指向同一對(duì)象。3、 在程序的運(yùn)行時(shí),動(dòng)態(tài)類(lèi)型判定。運(yùn)行時(shí)調(diào)用運(yùn)行時(shí)類(lèi)型,即它調(diào)用覆蓋后的方法。關(guān)系運(yùn)算符:instanceofa instanceof Animal;(這個(gè)式子的結(jié)果是一個(gè)布爾表達(dá)式)a為對(duì)象變量,Animal是類(lèi)名。上面語(yǔ)句是判定a是否可以貼Animal標(biāo)簽。如果可以貼則返回true,否則返回false。在上面的題目中: a instanceof Animal返回True, a instanceof Dog也返回True,instanceof用于判定是否將前面的對(duì)象變量賦值后邊的類(lèi)名。Instanceof一般用于在強(qiáng)制類(lèi)型轉(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)類(lèi)型判定針對(duì)的是方法。運(yùn)行程序訪問(wèn)的屬性仍為編譯時(shí)屬性。Overloading針對(duì)的是編譯時(shí)類(lèi)型,不存在運(yùn)行時(shí)的多態(tài)。習(xí)題:建立一個(gè)shape類(lèi),有circle和rect子類(lèi)。Shape類(lèi)有zhouchang()和area()兩種方法。(正方形)squ為rect子類(lèi),rect有cha()用于比較長(zhǎng)寬的差。覆蓋時(shí)考慮子類(lèi)的private及父類(lèi)的public(考慮多態(tài)),之所以這樣是避免調(diào)用A時(shí)出現(xiàn)實(shí)際調(diào)用B的情況。而出現(xiàn)錯(cuò)誤。11.29下午講的是教程上的Module6Module6-7包括:面向?qū)ο蟾呒?jí)、內(nèi)部類(lèi)、集合、反射(暫時(shí)不講)、例外。面向?qū)ο蟾呒?jí)、集合和例外都是面向?qū)ο蟮暮诵膬?nèi)容。面向?qū)ο蟾呒?jí): 修飾符:static:可修飾變量(屬性);可修飾方法;可修飾代碼塊。Static int data語(yǔ)句說(shuō)明data為類(lèi)變量,為一個(gè)類(lèi)的共享變量,屬于整個(gè)類(lèi)。Int data為實(shí)例變量。例:static int data;m1.data=0;m1.data+的結(jié)果為1,此時(shí)m2.data的結(jié)果也為1。Static定義的是一塊為整個(gè)類(lèi)共有的一塊存儲(chǔ)區(qū)域,其發(fā)生變化時(shí)訪問(wèn)到的數(shù)據(jù)都時(shí)經(jīng)過(guò)變化的。其變量可以通過(guò)類(lèi)名去訪問(wèn):類(lèi)名.變量名。與通過(guò)訪問(wèn)對(duì)象的編譯時(shí)類(lèi)型訪問(wèn)類(lèi)變量為等價(jià)的。Public static void printData()表明此類(lèi)方法為類(lèi)方法(靜態(tài)方法)靜態(tài)方法不需要有對(duì)象,可以使用類(lèi)名調(diào)用。靜態(tài)方法中不允許訪問(wèn)類(lèi)的非靜態(tài)成員,包括成員的變量和方法,因?yàn)榇藭r(shí)是通過(guò)類(lèi)調(diào)用的,沒(méi)有對(duì)象的概念。This.data是不可用的。一般情況下,主方法是靜態(tài)方法,所以可調(diào)用靜態(tài)方法,主方法為靜態(tài)方法是因?yàn)樗钦麄€(gè)軟件系統(tǒng)的入口,而進(jìn)入入口時(shí)系統(tǒng)中沒(méi)有任何對(duì)象,只能使用類(lèi)調(diào)用。覆蓋不適用于靜態(tài)方法。靜態(tài)方法不可被覆蓋。(允許在子類(lèi)中定義同名靜態(tài)方法,但是沒(méi)有多態(tài),嚴(yán)格的講,方法間沒(méi)有多態(tài)就不能稱(chēng)為覆蓋)當(dāng)static修飾代碼塊時(shí)(注:此代碼塊要在此類(lèi)的任何一個(gè)方法之外),那么這個(gè)代碼塊在代碼被裝載進(jìn)虛擬機(jī)生成對(duì)象的時(shí)候可被裝載一次,以后再也不執(zhí)行了。一般靜態(tài)代碼塊被用來(lái)初始化靜態(tài)成員。Static通常用于Singleton模式開(kāi)發(fā):Singleton是一種設(shè)計(jì)模式,高于語(yǔ)法,可以保證一個(gè)類(lèi)在整個(gè)系統(tǒng)中僅有一個(gè)對(duì)象。11.30final可以修飾類(lèi)、屬性、方法。當(dāng)用final修飾類(lèi)的時(shí)候,此類(lèi)不可被繼承,即final類(lèi)沒(méi)有子類(lèi)。這樣可以用final保證用戶(hù)調(diào)用時(shí)動(dòng)作的一致性,可以防止子類(lèi)覆蓋情況的發(fā)生。當(dāng)利用final修飾一個(gè)屬性(變量)的時(shí)候,此時(shí)的屬性成為常量。JAVA利用final定義常量(注意在JAVA命名規(guī)范中常量需要全部字母都大寫(xiě)):Final int AGE=10;常量的地址不可改變,但在地址中保存的值(即對(duì)象的屬性)是可以改變的。Final可以配合static使用。 ?Static final int age=10;在JAVA中利用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定義。如果在父類(lèi)中有final定義的方法,那么在子類(lèi)中繼承同一個(gè)方法。如果一個(gè)方法前有修飾詞private或static,則系統(tǒng)會(huì)自動(dòng)在前面加上final。即private和static方法默認(rèn)均為final方法。注:final并不涉及繼承,繼承取決于類(lèi)的修飾符是否為private、default、protected還是public。也就是說(shuō),是否繼承取決于這個(gè)方法對(duì)于子類(lèi)是否可見(jiàn)。Abstract(抽象)可以修飾類(lèi)、方法如果將一個(gè)類(lèi)設(shè)置為abstract,則此類(lèi)必須被繼承使用。此類(lèi)不可生成對(duì)象,必須被繼承使用。Abstract可以將子類(lèi)的共性最大限度的抽取出來(lái),放在父類(lèi)中,以提高程序的簡(jiǎn)潔性。Abstract雖然不能生成對(duì)象,但是可以聲明,作為編譯時(shí)類(lèi)型,但不能作為運(yùn)行時(shí)類(lèi)型。Final和abstract永遠(yuǎn)不會(huì)同時(shí)出現(xiàn)。當(dāng)abstract用于修飾方法時(shí),此時(shí)該方法為抽象方法,此時(shí)方法不需要實(shí)現(xiàn),實(shí)現(xiàn)留給子類(lèi)覆蓋,子類(lèi)覆蓋該方法之后方法才能夠生效。注意比較:private void print();此語(yǔ)句表示方法的空實(shí)現(xiàn)。Abstract void print(); 此語(yǔ)句表示方法的抽象,無(wú)實(shí)現(xiàn)。如果一個(gè)類(lèi)中有一個(gè)抽象方法,那么這個(gè)類(lèi)一定為一個(gè)抽象類(lèi)。反之,如果一個(gè)類(lèi)為抽象類(lèi),那么其中可能有非抽象的方法。如果讓一個(gè)非抽象類(lèi)繼承一個(gè)含抽象方法的抽象類(lèi),則編譯時(shí)會(huì)發(fā)生錯(cuò)誤。因?yàn)楫?dāng)一個(gè)非抽象類(lèi)繼承一個(gè)抽象方法的時(shí)候,本著只有一個(gè)類(lèi)中有一個(gè)抽象方法,那么這個(gè)類(lèi)必須為抽象類(lèi)的原則。這個(gè)類(lèi)必須為抽象類(lèi),這與此類(lèi)為非抽象沖突,所以報(bào)錯(cuò)。所以子類(lèi)的方法必須覆蓋父類(lèi)的抽象方法。方法才能夠起作用。只有將理論被熟練運(yùn)用在實(shí)際的程序設(shè)計(jì)的過(guò)程中之后,才能說(shuō)理論被完全掌握!為了實(shí)現(xiàn)多態(tài),那么父類(lèi)必須有定義。而父類(lèi)并不實(shí)現(xiàn),留給子類(lèi)去實(shí)現(xiàn)。此時(shí)可將父類(lèi)定義成abstract類(lèi)。如果沒(méi)有定義抽象的父類(lèi),那么編譯會(huì)出現(xiàn)錯(cuò)誤。Abstract和static不能放在一起,否則便會(huì)出現(xiàn)錯(cuò)誤。(這是因?yàn)閟tatic不可被覆蓋,而abstract為了生效必須被覆蓋。)例:(本例已存在CODINGabstractTestClass.java文件中)public class TestClass public static void 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)接口與類(lèi)屬于同一層次,實(shí)際上,接口是一種特殊的抽象類(lèi)。如: interface IApublic interface:公開(kāi)接口與類(lèi)相似,一個(gè)文件只能有一個(gè)public接口,且與文件名相同。在一個(gè)文件中不可同時(shí)定義一個(gè)public接口和一個(gè)public類(lèi)。一個(gè)接口中,所有方法為公開(kāi)、抽象方法;所有的屬性都是公開(kāi)、靜態(tài)、常量。一個(gè)類(lèi)實(shí)現(xiàn)一個(gè)接口的格式:class IAImple implements IA;一個(gè)類(lèi)實(shí)現(xiàn)接口,相當(dāng)于它繼承一個(gè)抽象類(lèi)。類(lèi)必須實(shí)現(xiàn)接口中的方法,否則其為一抽象類(lèi)。實(shí)現(xiàn)中接口和類(lèi)相同。接口中可不寫(xiě)public,但在子類(lèi)中實(shí)現(xiàn)接口的過(guò)程中public不可省。(如果剩去public則在編譯的時(shí)候提示出錯(cuò):對(duì)象無(wú)法從接口中實(shí)現(xiàn)方法。)注: 一個(gè)類(lèi)除繼承另外一個(gè)類(lèi),還可以實(shí)現(xiàn)接口;class IAImpl extends java.util.Arrylist implement IA 繼承類(lèi) 實(shí)現(xiàn)接口這樣可以實(shí)現(xiàn)變相的多繼承。 一個(gè)類(lèi)只能繼承另外一個(gè)類(lèi),但是它可以繼承多個(gè)接口,中間用“,”隔開(kāi)。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)的類(lèi)從父類(lèi)和接口繼承的都可做運(yùn)行時(shí)類(lèi)型。IAImple extends A implement IA,IBIB I=new IAImple();I instance of IAImple;I instance of A;I instance of IA;I instance of IB;返回的結(jié)果均為true.接口和多態(tài)都為JAVA技術(shù)的核心。接口往往被我們定義成一類(lèi)XX的東西。接口實(shí)際上是定義一個(gè)規(guī)范、標(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);用戶(hù)使用標(biāo)準(zhǔn)。接口通常用來(lái)屏蔽底層的差異。接口也因?yàn)樯鲜鲈虮挥脕?lái)保持架構(gòu)的穩(wěn)定性。JAVA中有一個(gè)特殊的類(lèi): Object。它是JAVA體系中所有類(lèi)的父類(lèi)(直接父類(lèi)或者間接父類(lèi))。此類(lèi)中的方法可以使所的類(lèi)均繼承。以下介紹的三種方法屬于Object:(1) finalize方法:當(dāng)一個(gè)對(duì)象被垃圾回收的時(shí)候調(diào)用的方法。(2) toString():是利用字符串來(lái)表示對(duì)象。當(dāng)我們直接打印定義的對(duì)象的時(shí)候,隱含的是打印toString()的返回值??梢酝ㄟ^(guò)子類(lèi)作為一個(gè)toString()來(lái)覆蓋父類(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中存的是地址,因?yàn)閯?chuàng)建了新的對(duì)象,所以存放的是不同的地址。附加知識(shí):字符串類(lèi)為JAVA中的特殊類(lèi),String中為final類(lèi),一個(gè)字符串的值不可重復(fù)。因此在JAVA VM(虛擬機(jī))中有一個(gè)字符串池,專(zhuān)門(mén)用來(lái)存儲(chǔ)字符串。如果遇到String a=”hello”時(shí)(注意沒(méi)有NEW,不是創(chuàng)建新串),系統(tǒng)在字符串池中尋找是否有”hello”,此時(shí)字符串池中沒(méi)有”hello”,那么系統(tǒng)將此字符串存到字符串池中,然后將”hello”在字符串池中的地址返回a。如果系統(tǒng)再遇到String b=”hello”,此時(shí)系統(tǒng)可以在字符串池中找到“hello”。則會(huì)把地址返回b,此時(shí)a與b為相同。String a=”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é)果均為false。以下為定義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 instanceof strudent) return false; /不同類(lèi) 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類(lèi),有String name,int id,double salary.運(yùn)用get和set方法,使用toString,使用equals。封裝類(lèi):JAVA為每一個(gè)簡(jiǎn)單數(shù)據(jù)類(lèi)型提供了一個(gè)封裝類(lèi),使每個(gè)簡(jiǎn)單數(shù)據(jù)類(lèi)型可以被Object來(lái)裝載。除了int和char,其余類(lèi)型首字母大寫(xiě)即成封裝類(lèi)。轉(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ì)被覆蓋。程序員自己編寫(xiě)的類(lèi)和JDK類(lèi)是一種合作關(guān)系。(因?yàn)槎鄳B(tài)的存在,可能存在我們調(diào)用JDK類(lèi)的情況,也可能存在JDK自動(dòng)調(diào)用我們的類(lèi)的情況。)注意:類(lèi)型轉(zhuǎn)換中doubleintergerstring之間的轉(zhuǎn)換最多。12.01內(nèi)部類(lèi):(注:所有使用內(nèi)部類(lèi)的地方都可以不用內(nèi)部類(lèi),使用內(nèi)部類(lèi)可以使程序更加的簡(jiǎn)潔,便于命名規(guī)范和劃分層次結(jié)構(gòu))。內(nèi)部類(lèi)是指在一個(gè)外部類(lèi)的內(nèi)部再定義一個(gè)類(lèi)。內(nèi)部類(lèi)作為外部類(lèi)的一個(gè)成員,并且依附于外部類(lèi)而存在的。內(nèi)部類(lèi)可為靜態(tài),可用PROTECTED和PRIVATE修飾。(而外部類(lèi)不可以:外部類(lèi)只能使用PUBLIC和DEFAULT)。內(nèi)部類(lèi)的分類(lèi):成員內(nèi)部類(lèi)、局部?jī)?nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)、匿名內(nèi)部類(lèi)(圖形是要用到,必須掌握)。 成員內(nèi)部類(lèi):作為外部類(lèi)的一個(gè)成員存在,與外部類(lèi)的屬性、方法并列。內(nèi)部類(lèi)和外部類(lèi)的實(shí)例變量可以共存。在內(nèi)部類(lèi)中訪問(wèn)實(shí)例變量:this.屬性在內(nèi)部類(lèi)訪問(wèn)外部類(lèi)的實(shí)例變量:外部類(lèi)名.this.屬性。成員內(nèi)部類(lèi)的優(yōu)點(diǎn):內(nèi)部類(lèi)作為外部類(lèi)的成員,可以訪問(wèn)外部類(lèi)的私有成員或?qū)傩?。(即使將外部?lèi)聲明為PRIVATE,但是對(duì)于處于其內(nèi)部的內(nèi)部類(lèi)還是可見(jiàn)的。)用內(nèi)部類(lèi)定義在外部類(lèi)中不可訪問(wèn)的屬性。這樣就在外部類(lèi)中實(shí)現(xiàn)了比外部類(lèi)的private還要小的訪問(wèn)權(quán)限。注意:內(nèi)部類(lèi)是一個(gè)編譯時(shí)的概念,一旦編譯成功,就會(huì)成為完全不同的兩類(lèi)。對(duì)于一個(gè)名為outer的外部類(lèi)和其內(nèi)部定義的名為inner的內(nèi)部類(lèi)。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類(lèi)。(編寫(xiě)一個(gè)程序檢驗(yàn):在一個(gè)TestOuter.java程序中驗(yàn)證內(nèi)部類(lèi)在編譯完成之后,會(huì)出現(xiàn)幾個(gè)class.)成員內(nèi)部類(lèi)不可以有靜態(tài)屬性。(為什么?)如果在外部類(lèi)的外部訪問(wèn)內(nèi)部類(lèi),使用out.inner.建立內(nèi)部類(lèi)對(duì)象時(shí)應(yīng)注意:在外部類(lèi)的內(nèi)部可以直接使用inner s=new inner();(因?yàn)橥獠款?lèi)知道inner是哪個(gè)類(lèi),所以可以生成對(duì)象。)而在外部類(lèi)的外部,要生成(new)一個(gè)內(nèi)部類(lèi)對(duì)象,需要首先建立一個(gè)外部類(lèi)對(duì)象(外部類(lèi)可用),然后在生成一個(gè)內(nèi)部類(lèi)對(duì)象。Outer.Inner in=Outer.new.Inner()。錯(cuò)誤的定義方式:Outer.Inner in=new Outer.Inner()。注意:當(dāng)Outer是一個(gè)private類(lèi)時(shí),外部類(lèi)對(duì)于其外部訪問(wèn)是私有的,所以就無(wú)法建立外部類(lèi)對(duì)象,進(jìn)而也無(wú)法建立內(nèi)部類(lèi)對(duì)象。 局部?jī)?nèi)部類(lèi):在方法中定義的內(nèi)部類(lèi)稱(chēng)為局部?jī)?nèi)部類(lèi)。與局部變量類(lèi)似,在局部?jī)?nèi)部類(lèi)前不加修飾符public和private,其范圍為定義它的代碼塊。注意:局部?jī)?nèi)部類(lèi)不僅可以訪問(wèn)外部類(lèi)實(shí)例變量,還可以訪問(wèn)外部類(lèi)的局部變量(但此時(shí)要求外部類(lèi)的局部變量必須為final)?在類(lèi)外不可直接生成局部?jī)?nèi)部類(lèi)(保證局部?jī)?nèi)部類(lèi)對(duì)外是不可見(jiàn)的)。要想使用局部?jī)?nèi)部類(lèi)時(shí)需要生成對(duì)象,對(duì)象調(diào)用方法,在方法中才能調(diào)用其局部?jī)?nèi)部類(lèi)。 靜態(tài)內(nèi)部類(lèi):(注意:前三種內(nèi)部類(lèi)與變量類(lèi)似,所以可以對(duì)照參考變量)靜態(tài)內(nèi)部類(lèi)定義在類(lèi)中,任何方法外,用static定義。靜態(tài)內(nèi)部類(lèi)只能訪問(wèn)外部類(lèi)的靜態(tài)成員。生成(new)一個(gè)靜態(tài)內(nèi)部類(lèi)不需要外部類(lèi)成員:這是靜態(tài)內(nèi)部類(lèi)和成員內(nèi)部類(lèi)的區(qū)別。靜態(tài)內(nèi)部類(lèi)的對(duì)象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通過(guò)生成外部類(lèi)對(duì)象來(lái)生成。這樣實(shí)際上使靜態(tài)內(nèi)部類(lèi)成為了一個(gè)頂級(jí)類(lèi)。靜態(tài)內(nèi)部類(lèi)不可用private來(lái)進(jìn)行定義。例子:對(duì)于兩個(gè)類(lèi),擁有相同的方法:People run();Machine run();此時(shí)有一個(gè)robot類(lèi):class Robot extends People implement Machine.此時(shí)run()不可直接實(shí)現(xiàn)。注意:當(dāng)類(lèi)與接口(或者是接口與接口)發(fā)生方法命名沖突的時(shí)候,此時(shí)必須使用內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)。用接口不能完全地實(shí)現(xiàn)多繼承,用接口配合內(nèi)部類(lèi)才能實(shí)現(xiàn)真正的多繼承。 匿名內(nèi)部類(lèi)(必須掌握):匿名內(nèi)部類(lèi)是一種特殊的局部?jī)?nèi)部類(lèi),它是通過(guò)匿名類(lèi)實(shí)現(xiàn)接口。IA被定義為接口。IA I=new IA();注:一個(gè)匿名內(nèi)部類(lèi)一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類(lèi),沒(méi)有類(lèi)名,根據(jù)多態(tài),我們使用其父類(lèi)名。因其為局部?jī)?nèi)部類(lèi),那么局部?jī)?nèi)部類(lèi)的所有限制都對(duì)其生效。匿名內(nèi)部類(lèi)是唯一一種無(wú)構(gòu)造方法類(lèi)。匿名內(nèi)部類(lèi)在編譯的時(shí)候由系統(tǒng)自動(dòng)起名Out$1.class。如果一個(gè)對(duì)象編譯時(shí)的類(lèi)型是接口,那么其運(yùn)行的類(lèi)型為實(shí)現(xiàn)這個(gè)接口的類(lèi)。因匿名內(nèi)部類(lèi)無(wú)構(gòu)造方法,所以其使用范圍非常的有限。(下午:)Exception(例外/異常)(教程上的MODEL7)對(duì)于程序可能出現(xiàn)的錯(cuò)誤應(yīng)該做出預(yù)案。例外是程序中所有出乎意料的結(jié)果。(關(guān)系到系統(tǒng)的健壯性)JAVA會(huì)將所有的錯(cuò)誤封裝成為一個(gè)對(duì)象,其根本父類(lèi)為T(mén)hrowable。Throwable有兩個(gè)子類(lèi):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è)子類(lèi):Runtime exception(未檢查異常)非Runtime exception(已檢查異常)(注意:無(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ì)的方法。已檢查異??隙缭匠隽颂摂M機(jī)的范圍。(比如“未找到文件”)如何處理已檢查異常(對(duì)于所有的已檢查異常都要進(jìn)行處理):首先了解異常形成的機(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,也可能是程序員寫(xiě)的程序,無(wú)論誰(shuí)寫(xiě)的,拋出一定用throw。例:public void print() throws Exception.對(duì)于方法a,如果它定義了throws Exception。那么當(dāng)它調(diào)用的方法b返回異常對(duì)象時(shí),方法a并不處理,而將這個(gè)異常對(duì)象向上一級(jí)返回,如果所有的方法均不進(jìn)行處理,返回到主方法,程序中止。(要避免所有的方法都返回的使用方法,因?yàn)檫@樣出現(xiàn)一個(gè)很小的異常就會(huì)令程序中止)。如果在方法的程序中有一行throw new Exception(),返回錯(cuò)誤,那么其后的程序不執(zhí)行。因?yàn)殄e(cuò)誤返回后,后面的程序肯定沒(méi)有機(jī)會(huì)執(zhí)行,那么JAVA認(rèn)為以后的程序沒(méi)有存在的必要。對(duì)于trycatch格式:try 可能出現(xiàn)錯(cuò)誤的代碼塊 catch(exception e)進(jìn)行處理的代碼 ; 對(duì)象變量的聲明用這種方法,如果代碼正確,那么程序不經(jīng)過(guò)catch語(yǔ)句直接向下運(yùn)行;如果代碼不正確,則將返回的異常對(duì)象和e進(jìn)行匹配,如果匹配成功,則處理其后面的異常處理代碼。(如果用exception來(lái)聲明e的話,因?yàn)閑xception為所有exception對(duì)象的父類(lèi),所有肯定匹配成功)。處理完代碼后這個(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。我們可以寫(xiě)多個(gè)catch語(yǔ)句,但是不能將父類(lèi)型的exception的位置寫(xiě)在子類(lèi)型的excepiton之前,因?yàn)檫@樣父類(lèi)型肯定先于子類(lèi)型被匹配,所有子類(lèi)型就成為廢話。JAVA編譯出錯(cuò)。在try,catch后還可以再跟一子句finally。其中的代碼語(yǔ)句無(wú)論如何都會(huì)被執(zhí)行(因?yàn)閒inally子句的這個(gè)特性,所以一般將釋放資源,關(guān)閉連接的語(yǔ)句寫(xiě)在里面)。如果在程序中書(shū)寫(xiě)了檢查(拋出)exception但是沒(méi)有對(duì)這個(gè)可能出現(xiàn)的檢查結(jié)果進(jìn)行處理,那么程序就會(huì)報(bào)錯(cuò)。而如果只有處理情況(try)而沒(méi)有相應(yīng)的catch子句,則編譯還是通不過(guò)。如何知道在編寫(xiě)的程序中會(huì)出現(xiàn)例外呢1 調(diào)用方法,查看API中查看方法中是否有已檢查錯(cuò)誤。2 在編譯的過(guò)程中看提示信息,然后加上相應(yīng)的處理。Exception有一個(gè)message屬性。在使用catch的時(shí)候可以調(diào)用:Catch(IOException e)System.out.println(e.message();Catch(IOException e)e.printStackTrace();上面這條語(yǔ)句回告訴我們出錯(cuò)類(lèi)型所歷經(jīng)的過(guò)程,在調(diào)試的中非常有用。開(kāi)發(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(積極)和try catch(消極)兩種處理方法。對(duì)于try catch放在能夠很好地處理例外的位置(即放在具備對(duì)例外進(jìn)行處理的能力的位置)。如果沒(méi)有處理能力就繼續(xù)上拋。當(dāng)我們自己定義一個(gè)例外類(lèi)的時(shí)候必須使其繼承excepiton或者RuntimeException。Throw是一個(gè)語(yǔ)句,用來(lái)做拋出例外的功能。而throws是表示如果下級(jí)方法中如果有例外拋出,那么本方法不做處理,繼續(xù)向上拋出。Throws后跟的是例外類(lèi)型。斷言是一種調(diào)試工具(assert)其后跟的是布爾類(lèi)型的表達(dá)式,如果表達(dá)式結(jié)果為真不影響程序運(yùn)行。如果為假系統(tǒng)出現(xiàn)低級(jí)錯(cuò)誤,在屏幕上出現(xiàn)assert信息。Assert只是用于調(diào)試。在產(chǎn)品編譯完成后上線assert代碼就被刪除了。方法的覆蓋中,如果子類(lèi)的方法拋出的例外是父類(lèi)方法拋出的例外的父類(lèi)型,那么編譯就會(huì)出錯(cuò):子類(lèi)無(wú)法覆蓋父類(lèi)。結(jié)論:子類(lèi)方法不可比父類(lèi)方法拋出更多的例外。子類(lèi)拋出的例外或者與父類(lèi)拋出的例外一致,或者是父類(lèi)拋出例外的子類(lèi)型?;蛘咦宇?lèi)型不拋出例外。如果父類(lèi)型無(wú)throws時(shí),子類(lèi)型也不允許出現(xiàn)throws。此時(shí)只能使用try catch。練習(xí):寫(xiě)一個(gè)方法:int add(int a,int b) return a+b;當(dāng)a+b=100;拋出100為異常處理。12.02集合(從本部分開(kāi)始涉及API)集合是指一個(gè)對(duì)象容納了多個(gè)對(duì)象,這個(gè)集合對(duì)象主要用來(lái)管理維護(hù)一系列相似的對(duì)象。數(shù)組就是一種對(duì)象。(練習(xí):如何編寫(xiě)一個(gè)數(shù)組程序,并進(jìn)行遍歷。)java.util.*定義了一系列的接口和類(lèi),告訴我們用什么類(lèi)NEW出一個(gè)對(duì)象,可以進(jìn)行超越數(shù)組的操作。(注:JAVA1.5對(duì)JAVA1.4的最大改進(jìn)就是增加了對(duì)范型的支持)集合框架接口的分類(lèi):(分collection接口 和 map接口) Collection接口 Map接口List接口 Set接口 SortedMap接口 SortedSet接口JAVA中所有與集合有關(guān)的實(shí)現(xiàn)類(lèi)都是這六個(gè)接口的實(shí)現(xiàn)類(lèi)。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))SortedSet會(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值排序,則稱(chēng)其為SortedMap。(如字典)!注意數(shù)組和集合的區(qū)別:數(shù)組中只能存簡(jiǎn)單數(shù)據(jù)類(lèi)型。Collection接口和Map接口只能存對(duì)象。以下介紹接口:List接口:(介紹其下的兩個(gè)實(shí)現(xiàn)類(lèi):ArrayList和LinkedList)ArrayList和數(shù)組非常類(lèi)似,其底層也用數(shù)組組織數(shù)據(jù),ArrayList是動(dòng)態(tài)可變數(shù)組。 底層:指存儲(chǔ)格式。說(shuō)明ArrayList對(duì)象都是存在于數(shù)組中。注:數(shù)組和集合都是從下標(biāo)0開(kāi)始。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()(即迭代器)來(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í):寫(xiě)一個(gè)程序,輸入對(duì)象信息,比較基本信息。集合中每一個(gè)元素都有對(duì)象,如有字符串要經(jīng)過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換。Collections是工具類(lèi),所有方法均為有用方法,且方法為static。有Sort方法用于給List排序。Collections.Sort()分為兩部分,一部分為排序規(guī)則;一部分為排序算法。規(guī)則用來(lái)判斷對(duì)象;算法是考慮如何排序。對(duì)于自定義對(duì)象,Sort不知道規(guī)則,所以無(wú)法比較。這種情況下一定要定義排序規(guī)則。方式有兩種: java.lang下面有一個(gè)接口:Comparable(可比較的)可以讓自定義對(duì)象實(shí)現(xiàn)一個(gè)接口,這個(gè)接口只有一個(gè)方法comparableTo(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ì)象o對(duì)象,則返回值0。(可將返回值定義為-1)看TestArraylist的java代碼。我們通過(guò)返回值1和-1位置的調(diào)換來(lái)實(shí)現(xiàn)升序和降序排列的轉(zhuǎn)換。 java.util下有一個(gè)Comparator(比較器)它擁有compare(),用來(lái)比較兩個(gè)方法。要生成比較器,則用Sort中Sort(List,List(Compate))第二種方法更靈活,且在運(yùn)行的時(shí)候不用編譯。注意:要想實(shí)現(xiàn)comparTo()就必須在主方法中寫(xiě)上implement comparable.練習(xí):生成一個(gè)EMPLOYEE類(lèi),然后將一系列對(duì)象放入到ArrayList。用Iterator遍歷,排序之后,再進(jìn)行遍歷。集合的最大缺點(diǎn)是無(wú)法進(jìn)行類(lèi)型判定(這個(gè)缺點(diǎn)在JAVA1.5中已經(jīng)解決),這樣就可能出現(xiàn)因?yàn)轭?lèi)型不同而出現(xiàn)類(lèi)型錯(cuò)誤。解決的方法是添加類(lèi)型的判斷。LinkedList接口(在代碼的使用過(guò)程中和ArrayList沒(méi)有什么區(qū)別)ArrayLis

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論