我學(xué)院:JAVA的面向?qū)ο缶幊讨R點解析_第1頁
我學(xué)院:JAVA的面向?qū)ο缶幊讨R點解析_第2頁
我學(xué)院:JAVA的面向?qū)ο缶幊讨R點解析_第3頁
我學(xué)院:JAVA的面向?qū)ο缶幊讨R點解析_第4頁
我學(xué)院:JAVA的面向?qū)ο缶幊讨R點解析_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、JAVA的面向?qū)ο缶幊讨R點解析面向?qū)ο笾饕槍γ嫦蜻^程。面向過程的基本單元是函數(shù)。什么是對象:EVERYTHING IS OBJECT(萬物皆對象)所有的事物都有兩個方面:有什么(屬性):用來描述對象。能夠做什么(方法):告訴外界對象有那些功能。后者以前者為基礎(chǔ)。大的對象的屬性也可以是一個對象。為什么要使用面向?qū)ο螅菏紫龋嫦驅(qū)ο蠓先祟惪创挛锏囊话阋?guī)律。對象的方法的實現(xiàn)細(xì)節(jié)是屏蔽的,只有對象方法的實現(xiàn)者了解細(xì)節(jié)。方法的定義非常重要。方法有參數(shù),也可能有返回值。注意區(qū)分:對象(本身)、對象的實現(xiàn)者、對象的調(diào)用者。分析對象主要從方法開始。我們通過類來看待對象,類是對象的抽象。其次,采用面向?qū)?/p>

2、象方法可以使系統(tǒng)各部分各司其職、各盡所能。對象之間的耦合性一定要低(比如不同硬盤和不同主板之間的關(guān)系)。這樣才能使每個對象本身做成最好的。對于對象的要求:高內(nèi)聚、低耦合,這樣容易拼裝成為一個系統(tǒng)。實現(xiàn)高內(nèi)聚就是要最大限度低提高復(fù)用性(復(fù)用性好是因為高內(nèi)聚)??蓮?fù)用性是OOP的基礎(chǔ)。比較面向過程的思想和面向?qū)ο蟮乃枷耄好嫦蜻^程的思想:由過程、步驟、函數(shù)組成,以過程為核心;面向?qū)ο蟮乃枷耄阂詫ο鬄橹行?,先開發(fā)類,得到對象,通過對象之間相互通信實現(xiàn)功能。面向過程是先有算法,后有數(shù)據(jù)結(jié)構(gòu)。面向?qū)ο笫窍扔袛?shù)據(jù)結(jié)構(gòu),然后再有算法。在用面向?qū)ο笏枷腴_發(fā)的過程中,可以復(fù)用對象就進(jìn)行復(fù)用,如無法進(jìn)行復(fù)用則開發(fā)新

3、的對象。開發(fā)過程是用對個簡單的對象的多個簡單的方法,來實現(xiàn)復(fù)雜的功能 。從語法上來看,一個類是一個新的數(shù)據(jù)類型。在面向?qū)ο缶幊讨?,除了簡單?shù)據(jù)類型,就是對象類型。定義類的格式:class Student 代碼注意類名中單詞的首字母大寫。實例變量:定義在類中但在任何方法之外。(New出來的均有初值)局部變量:定義在方法之中的變量。局部變量要先賦值,再進(jìn)行運算,而實例變量均已經(jīng)賦初值。這是局部變量和實例變量的一大區(qū)別。實例變量的對象賦值為null。局部變量不允許范圍內(nèi)定義兩個同名變量。實例變量的作用域在本類中完全有效,當(dāng)被其他的類調(diào)用的時候也可能有效。實例變量和局部變量允許命名沖突。書寫方法的格式

4、:修飾符 返回值 方法名 調(diào)用過程中 方法體可能出現(xiàn)的例外 public int/void addNumber(參數(shù)) throw Excepion 例:public int addNumber(int a,int b)注:方法名中的參數(shù)int a,int b為局部變量類方法中的一類特殊方法:構(gòu)造方法。構(gòu)造方法是當(dāng)用類生成對象時,系統(tǒng)在生成對象的過程中利用的方法。注意:構(gòu)造方法在生成對象的時候會被調(diào)用,但并不是構(gòu)造方法生成了對象。構(gòu)造方法沒有返回值。格式為:public 方法名。構(gòu)造方法的方法名與類名相同。構(gòu)造方法是在對象生成的過程中自動調(diào)用,不可能利用指令去調(diào)用。在一個對象的生成周期中構(gòu)造方

5、法只用一次,一旦這個對象生成,那么這個構(gòu)造方法失效。用類來生成對象的語句:Student s=new Student()。第一個Student表示這是用Student類進(jìn)行定義。“Student()”表示調(diào)用一個無參數(shù)的構(gòu)造方法。如果()中有參數(shù),則系統(tǒng)構(gòu)造對象的過程中調(diào)用有參的方法。此時S稱為一個對象變量。 Student s的存儲區(qū)域存放的是地址:一個對象在硬盤上占有一個連續(xù)地址,首地址賦予s空間。S稱為對象Student的引用。注意:在對象變量中存放的是引用(地址);在簡單變量中存放的是數(shù)值。可以構(gòu)造多個構(gòu)造方法,但多個構(gòu)造方法的參數(shù)表一定不同,參數(shù)順序不同即屬于不同的構(gòu)造方法

6、:public student(string name,int a)public student(int a,string name)為兩個不同的構(gòu)造方法。如果我們未給系統(tǒng)提供一個構(gòu)造方法,那么系統(tǒng)會自動提供一個為空的構(gòu)造方法。練習(xí):寫一個類,定義一個對象,定義兩個構(gòu)造方法:一個有參,一個無參。(編寫一個程序驗證對象的傳遞的值為地址)注意下面這種形式:static void changename(student stu)stu.setName “LUCY”注意生成新的對象與舊對象指向無關(guān),生成新對象生命消亡與舊對象無關(guān)。面向?qū)ο蠓椒ǖ闹剌d(overloading)和覆蓋(overriding)

7、。在有些JAVA書籍中將overriding稱為重載,overloading稱為過載。Overloading在一個類中可以定義多個同名方法,各個方法的參數(shù)表一定不同。但修飾詞可能相同,返回值也可能相同。在程序的編譯過程中根據(jù)變量類型來找相應(yīng)的方法。因此也有人認(rèn)為 overloading是編譯時的多態(tài),以后我們還會學(xué)到運行時多態(tài)。為什么會存在overloading技術(shù)呢?作為應(yīng)對方法的細(xì)節(jié)。利用類型的差異來影響對方法的調(diào)用。吃()可以分為吃肉,吃菜,吃藥,在一個類中可以定義多個吃方法。構(gòu)造方法也可以實現(xiàn)overloading。例:public void teach();public void t

8、each(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)造方法時,this必須為第一條語句,然后才是其他語句。This表示當(dāng)前對象。Public void printNum() Int number=40; System.ou

9、t.println(this.number); 此時打印的是實例變量,而非局部變量,即定義在類中而非方法中的變量。This.number表示實例變量。誰調(diào)用this.number那么誰即為當(dāng)前(this)對象的number方法。封裝:使對象的屬性盡可能私有,對象的方法盡可能的公開。用private表示此成員屬性為該類的私有屬性。Public表示該屬性(方法)公開;Private表示該屬性(方法)為只有本類內(nèi)部可以訪問(類內(nèi)部可見)。(想用private還要用set和get方法供其他方法調(diào)用,這樣可以保證對屬性的訪問方式統(tǒng)一,并且便于維護(hù)訪問權(quán)限以及屬性數(shù)據(jù)合法性)如果沒有特殊情況,屬性一定私有

10、,方法該公開的公開。如果不指明誰調(diào)用方法,則默認(rèn)為this。區(qū)分實例變量和局部變量時一定要寫this。11.29繼承:父類(SuperClass)和 子類(SonClass)。父類的非私有化屬性和方法可以默認(rèn)繼承到子類。Class Son extends Father而如果父類中的私有方法被子類調(diào)用的話,則編譯報錯。父類的構(gòu)造方法子類不可以繼承,更不存在覆蓋的問題。(非構(gòu)造方法可以)如果子類訪問父類的構(gòu)造方法,則在編譯的時候提示訪問不到該方法。JAVA中不允許多繼承,一個類有且只有一個父類(單繼承)。JAVA的數(shù)據(jù)結(jié)構(gòu)為樹型結(jié)構(gòu),而非網(wǎng)狀。(JAVA通過接口和內(nèi)部類實現(xiàn)多繼承)方法的覆蓋(ov

11、erriding)方法的重載并不一定是在一個類中:子類可以從父類繼承一個方法,也可以定義一個同名異參的方法,也稱為overloading。當(dāng)子類從父類繼承一個無參方法,而又定義了一個同樣的無參方法,則子類新寫的方法覆蓋父類的方法,稱為覆蓋。(注意返回值類型也必須相同,否則編譯出錯。)如果方法不同,則成重載。對于方法的修飾詞,子類方法要比父類的方法范圍更加的寬泛。父類為public,那么子類為private則出現(xiàn)錯誤。之所以構(gòu)造方法先運行父類再運行子類是因為構(gòu)造方法是無法覆蓋的。以下范圍依次由嚴(yán)到寬:private :本類訪問;default :表示默認(rèn),不僅本類訪問,而且是同包可見。Prote

12、cted:同包可見+不同包的子類可見Public :表示所有的地方均可見。當(dāng)構(gòu)造一個對象的時候,系統(tǒng)先構(gòu)造父類對象,再構(gòu)造子類對象。構(gòu)造一個對象的順序:(注意:構(gòu)造父類對象的時候也是這幾步) 遞歸地構(gòu)造父類對象; 順序地調(diào)用本類成員屬性賦初值語句; 本類的構(gòu)造方法。Super()表示調(diào)用父類的構(gòu)造方法。Super()也和this一樣必須放在第一行。This()用于調(diào)用本類的構(gòu)造方法。如果沒有定義構(gòu)造方法,那么就會調(diào)用父類的無參構(gòu)造方法,即super()。要養(yǎng)成良好的編程習(xí)慣:就是要加上默認(rèn)的父類無參的構(gòu)造方法。思考:可是如果我們沒有定義無參的構(gòu)造方法,而在程序中構(gòu)造了有參的構(gòu)造方法,那么如果方

13、法中沒有參數(shù),那么系統(tǒng)還會調(diào)用有參的構(gòu)造方法么?應(yīng)該不會。多態(tài):多態(tài)指的是編譯時類型變化,而運行時類型不變。多態(tài)分兩種: 編譯時多態(tài):編譯時動態(tài)重載; 運行時多態(tài):指一個對象可以具有多個類型。對象是客觀的,人對對象的認(rèn)識是主觀的。例:Animal a=new Dog();查看格式名稱;Dog d=(Dog)a。聲明父類來引用子類。(思考上面的格式)運行時多態(tài)的三原則:(應(yīng)用時為覆蓋)1、 對象不變;(改變的是主觀認(rèn)識)2、 對于對象的調(diào)用只能限于編譯時類型的方法,如調(diào)用運行時類型方法報錯。在上面的例子中:Animal a=new Dog();對象a的編譯時類型為Animal,運行時類型為dog

14、。注意:編譯時類型一定要為運行時類型的父類(或者同類型)。對于語句:Dog d=(Dog)a。將d強(qiáng)制聲明為a類型,此時d為Dog(),此時d就可以調(diào)用運行時類型。注意:a和d指向同一對象。3、 在程序的運行時,動態(tài)類型判定。運行時調(diào)用運行時類型,即它調(diào)用覆蓋后的方法。關(guān)系運算符:instanceofa instanceof Animal;(這個式子的結(jié)果是一個布爾表達(dá)式)a為對象變量,Animal是類名。上面語句是判定a是否可以貼Animal標(biāo)簽。如果可以貼則返回true,否則返回false。在上面的題目中: a instanceof Animal返回 True, a instan

15、ceof Dog也返回 True,instanceof用于判定是否將前面的對象變量賦值后邊的類名。Instanceof一般用于在強(qiáng)制類型轉(zhuǎn)換之前判定變量是否可以強(qiáng)制轉(zhuǎn)換。如果Animal a=new Animal();Dog d=Dog()a;此時編譯無誤,但運行則會報錯。Animal a=new Dog()相當(dāng)于下面語句的功能:Animal a=getAnimal();Public static Animal.getAnimal;Return new Dog();封裝、繼承、多態(tài)為面向?qū)ο蟮娜蠡ㄌ匦裕_\行時的動態(tài)類型判定針對的是方法。運行程序訪問的屬性仍為編譯時屬性。Ove

16、rloading針對的是編譯時類型,不存在運行時的多態(tài)。習(xí)題:建立一個shape類,有circle和rect子類。Shape類有zhouchang()和area()兩種方法。(正方形)squ為rect子類,rect有cha()用于比較長寬的差。覆蓋時考慮子類的private及父類的public(考慮多態(tài)),之所以這樣是避免調(diào)用A時出現(xiàn)實際調(diào)用B的情況。而出現(xiàn)錯誤。11.29下午講的是教程上的Module6Module6-7包括:面向?qū)ο蟾呒墶?nèi)部類、集合、反射(暫時不講)、例外。面向?qū)ο蟾呒墶⒓虾屠舛际敲嫦驅(qū)ο蟮暮诵膬?nèi)容。面向?qū)ο蟾呒墸?修飾符:static:可修飾變量(屬性);可修飾方法

17、;可修飾代碼塊。Static int data語句說明data為類變量,為一個類的共享變量,屬于整個類。Int data為實例變量。例:static int data;m1.data=0;m1.data+的結(jié)果為1,此時m2.data的結(jié)果也為1。Static定義的是一塊為整個類共有的一塊存儲區(qū)域,其發(fā)生變化時訪問到的數(shù)據(jù)都時經(jīng)過變化的。其變量可以通過類名去訪問:類名.變量名。與通過訪問對象的編譯時類型訪問類變量為等價的。Public static void printData()表明此類方法為類方法(靜態(tài)方法)靜態(tài)方法不需要有對象,可以使用類名調(diào)用。靜態(tài)方法中不允許訪問類的非靜態(tài)成員,包括成

18、員的變量和方法,因為此時是通過類調(diào)用的,沒有對象的概念。This.data是不可用的。一般情況下,主方法是靜態(tài)方法,所以可調(diào)用靜態(tài)方法,主方法為靜態(tài)方法是因為它是整個軟件系統(tǒng)的入口,而進(jìn)入入口時系統(tǒng)中沒有任何對象,只能使用類調(diào)用。覆蓋不適用于靜態(tài)方法。靜態(tài)方法不可被覆蓋。(允許在子類中定義同名靜態(tài)方法,但是沒有多態(tài),嚴(yán)格的講,方法間沒有多態(tài)就不能稱為覆蓋)當(dāng)static修飾代碼塊時(注:此代碼塊要在此類的任何一個方法之外),那么這個代碼塊在代碼被裝載進(jìn)虛擬機(jī)生成對象的時候可被裝載一次,以后再也不執(zhí)行了。一般靜態(tài)代碼塊被用來初始化靜態(tài)成員。Static通常用于Singleton模式開發(fā):Sing

19、leton是一種設(shè)計模式,高于語法,可以保證一個類在整個系統(tǒng)中僅有一個對象。11.30final可以修飾類、屬性、方法。當(dāng)用final修飾類的時候,此類不可被繼承,即final類沒有子類。這樣可以用final保證用戶調(diào)用時動作的一致性,可以防止子類覆蓋情況的發(fā)生。當(dāng)利用final修飾一個屬性(變量)的時候,此時的屬性成為常量。JAVA利用final定義常量(注意在JAVA命名規(guī)范中常量需要全部字母都大寫):Final int AGE=10;常量的地址不可改變,但在地址中保存的值(即對象的屬性)是可以改變的。Final可以配合static使用。 ?Static final int age=10;

20、在JAVA中利用public static final的組合方式對常量進(jìn)行標(biāo)識(固定格式)。對于在構(gòu)造方法中利用final進(jìn)行賦值的時候,此時在構(gòu)造之前系統(tǒng)設(shè)置的默認(rèn)值相對于構(gòu)造方法失效。常量(這里的常量指的是實例常量:即成員變量)賦值:在初始化的時候通過顯式聲明賦值。Final int x=3;在構(gòu)造的時候賦值。局部變量可以隨時賦值。利用final定義方法:這樣的方法為一個不可覆蓋的方法。Public final void print();為了保證方法的一致性(即不被改變),可將方法用final定義。如果在父類中有final定義的方法,那么在子類中繼承同一個方法。如果一個方法前有修飾詞pri

21、vate或static,則系統(tǒng)會自動在前面加上final。即private和static方法默認(rèn)均為final方法。注:final并不涉及繼承,繼承取決于類的修飾符是否為private、default、protected還是public。也就是說,是否繼承取決于這個方法對于子類是否可見。Abstract(抽象)可以修飾類、方法如果將一個類設(shè)置為abstract,則此類必須被繼承使用。此類不可生成對象,必須被繼承使用。Abstract可以將子類的共性最大限度的抽取出來,放在父類中,以提高程序的簡潔性。Abstract雖然不能生成對象,但是可以聲明,作為編譯時類型,但不能作為運行時類型。Final

22、和abstract永遠(yuǎn)不會同時出現(xiàn)。當(dāng)abstract用于修飾方法時,此時該方法為抽象方法,此時方法不需要實現(xiàn),實現(xiàn)留給子類覆蓋,子類覆蓋該方法之后方法才能夠生效。注意比較:private void print();此語句表示方法的空實現(xiàn)。Abstract void print(); 此語句表示方法的抽象,無實現(xiàn)。如果一個類中有一個抽象方法,那么這個類一定為一個抽象類。反之,如果一個類為抽象類,那么其中可能有非抽象的方法。如果讓一個非抽象類繼承一個含抽象方法的抽象類,則編譯時會發(fā)生錯誤。因為當(dāng)一個非抽象類繼承一個抽象方法的時候,本著只有一個類中有一個抽象方法,那么這個類必須為抽象類的原則。這個

23、類必須為抽象類,這與此類為非抽象沖突,所以報錯。所以子類的方法必須覆蓋父類的抽象方法。方法才能夠起作用。只有將理論被熟練運用在實際的程序設(shè)計的過程中之后,才能說理論被完全掌握!為了實現(xiàn)多態(tài),那么父類必須有定義。而父類并不實現(xiàn),留給子類去實現(xiàn)。此時可將父類定義成abstract類。如果沒有定義抽象的父類,那么編譯會出現(xiàn)錯誤。Abstract和static不能放在一起,否則便會出現(xiàn)錯誤。(這是因為static不可被覆蓋,而abstract為了生效必須被覆蓋。)例:(本例已存在CODINGabstractTestClass.java文件中)public class TestClass public

24、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)接口與類屬于同一層次,實際上,接口是一種特殊的抽象類。如: interface IApublic interface:公開接口與類相似,一個文件只能有一個public接口

25、,且與文件名相同。在一個文件中不可同時定義一個public接口和一個public類。一個接口中,所有方法為公開、抽象方法;所有的屬性都是公開、靜態(tài)、常量。一個類實現(xiàn)一個接口的格式:class IAImple implements IA;一個類實現(xiàn)接口,相當(dāng)于它繼承一個抽象類。類必須實現(xiàn)接口中的方法,否則其為一抽象類。實現(xiàn)中接口和類相同。接口中可不寫public,但在子類中實現(xiàn)接口的過程中public不可省。(如果剩去public則在編譯的時候提示出錯:對象無法從接口中實現(xiàn)方法。)注: 一個類除繼承另外一個類,還可以實現(xiàn)接口;class IAImpl extends java.util.Arry

26、list implement IA 繼承類 實現(xiàn)接口這樣可以實現(xiàn)變相的多繼承。 一個類只能繼承另外一個類,但是它可以繼承多個接口,中間用“,”隔開。Implements IA,IB所謂實現(xiàn)一個接口,就是指實現(xiàn)接口中的方法。 接口和接口之間可以定義繼承關(guān)系,并且接口之間允許實現(xiàn)多繼承。例:interface IC extends IA,IB;接口也可以用于定義對象IA I=new IAImpl();實現(xiàn)的類從父類和接口繼承的都可做運行時類型。IAImple extends A implement IA,IBIB I=new IAImple();I instance of IAImple;I in

27、stance of A;I instance of IA;I instance of IB;返回的結(jié)果均為true.接口和多態(tài)都為JAVA技術(shù)的核心。接口往往被我們定義成一類XX的東西。接口實際上是定義一個規(guī)范、標(biāo)準(zhǔn)。 通過接口可以實現(xiàn)不同層次、不同體系對象的共同屬性;通過接口實現(xiàn)write once as anywhere.以JAVA數(shù)據(jù)庫連接為例子:JDBC制定標(biāo)準(zhǔn);數(shù)據(jù)廠商實現(xiàn)標(biāo)準(zhǔn);用戶使用標(biāo)準(zhǔn)。接口通常用來屏蔽底層的差異。接口也因為上述原因被用來保持架構(gòu)的穩(wěn)定性。JAVA中有一個特殊的類: Object。它是JAVA體系中所有類的父類(直接父類或者間接父類)。此類中的方法可以使所的類均

28、繼承。以下介紹的三種方法屬于Object:(1) finalize方法:當(dāng)一個對象被垃圾回收的時候調(diào)用的方法。(2) toString():是利用字符串來表示對象。當(dāng)我們直接打印定義的對象的時候,隱含的是打印toString()的返回值??梢酝ㄟ^子類作為一個toString()來覆蓋父類的toString()。以取得我們想得到的表現(xiàn)形式,即當(dāng)我們想利用一個自定義的方式描述對象的時候,我們應(yīng)該覆蓋toString()。(3)equal首先試比較下例:String A=new String(“hello”);String A=new String(“hello”);A=B(此時程序返回為FALSE

29、)因為此時AB中存的是地址,因為創(chuàng)建了新的對象,所以存放的是不同的地址。附加知識:字符串類為JAVA中的特殊類,String中為final類,一個字符串的值不可重復(fù)。因此在JAVA VM(虛擬機(jī))中有一個字符串池,專門用來存儲字符串。如果遇到String a=”hello”時(注意沒有NEW,不是創(chuàng)建新串),系統(tǒng)在字符串池中尋找是否有”hello”,此時字符串池中沒有”hello”,那么系統(tǒng)將此字符串存到字符串池中,然后將”hello”在字符串池中的地址返回a。如果系統(tǒng)再遇到String b=”hello”,此時系統(tǒng)可以在字符串池中找到 “hello”。則會把地址返回b,此時a與b為

30、相同。String a=”hello”;System.out.println(a=”hello”);系統(tǒng)的返回值為true。故如果要比較兩個字符串是否相同(而不是他們的地址是否相同)??梢詫調(diào)用equal:System.out.println(a.equal(b);equal用來比較兩個對象中字符串的順序。 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(

31、b);此時返回的結(jié)果均為false。以下為定義equal(加上這個定義,返回ture或false)public boolean equals(Object o) student s=(student)o; if (.equals()&&s.age=this.age)else return false;如果equals()返回的值為以下為實現(xiàn)標(biāo)準(zhǔn)equals的流程:public boolean equals(Object o) if (this=o) return trun; /此時兩者相同 if (o=null) return false; if

32、(! o instanceof strudent) return false; /不同類 studeng s=(student)o; /強(qiáng)制轉(zhuǎn)換 if (.equals()&&s.age=this.age) return true;else return false;以上過程為實現(xiàn)equals的標(biāo)準(zhǔn)過程。 練習(xí):建立一個employee類,有String name,int id,double salary.運用get和set方法,使用toString,使用equals。封裝類:JAVA為每一個簡單數(shù)據(jù)類型提供了一個封裝類,使每個簡單數(shù)據(jù)類型可以被O

33、bject來裝載。除了int和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)容:“=”在任何時候都是比較地址,這種比較永遠(yuǎn)不會被覆蓋。程序員自己編寫的類和JDK類是一種合作關(guān)系。(因為多態(tài)的存在,可能存在我們調(diào)用JDK類的情況,也可能存在JDK自動調(diào)用我們的類的情況。)注意:類型轉(zhuǎn)換中doubleintergerstring之間的轉(zhuǎn)換最多。12.01內(nèi)部類:(注:所有

34、使用內(nèi)部類的地方都可以不用內(nèi)部類,使用內(nèi)部類可以使程序更加的簡潔,便于命名規(guī)范和劃分層次結(jié)構(gòu))。內(nèi)部類是指在一個外部類的內(nèi)部再定義一個類。內(nèi)部類作為外部類的一個成員,并且依附于外部類而存在的。內(nèi)部類可為靜態(tài),可用PROTECTED和PRIVATE修飾。(而外部類不可以:外部類只能使用PUBLIC和DEFAULT)。內(nèi)部類的分類:成員內(nèi)部類、局部內(nèi)部類、靜態(tài)內(nèi)部類、匿名內(nèi)部類(圖形是要用到,必須掌握)。 成員內(nèi)部類:作為外部類的一個成員存在,與外部類的屬性、方法并列。內(nèi)部類和外部類的實例變量可以共存。在內(nèi)部類中訪問實例變量:this.屬性在內(nèi)部類訪問外部類的實例變量:外部類名.this.屬性。成

35、員內(nèi)部類的優(yōu)點:內(nèi)部類作為外部類的成員,可以訪問外部類的私有成員或?qū)傩?。(即使將外部類聲明為PRIVATE,但是對于處于其內(nèi)部的內(nèi)部類還是可見的。)用內(nèi)部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現(xiàn)了比外部類的private還要小的訪問權(quán)限。注意:內(nèi)部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。對于一個名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。(編寫一個程序檢驗:在一個TestOuter.java程序中驗證內(nèi)部類在編譯完成之后,會出現(xiàn)幾個class.)成員內(nèi)部類不可以有靜態(tài)屬

36、性。(為什么?)如果在外部類的外部訪問內(nèi)部類,使用out.inner.建立內(nèi)部類對象時應(yīng)注意:在外部類的內(nèi)部可以直接使用inner s=new inner();(因為外部類知道inner是哪個類,所以可以生成對象。)而在外部類的外部,要生成(new)一個內(nèi)部類對象,需要首先建立一個外部類對象(外部類可用),然后在生成一個內(nèi)部類對象。Outer.Inner in=Outer.new.Inner()。錯誤的定義方式:Outer.Inner in=new Outer.Inner()。注意:當(dāng)Outer是一個private類時,外部類對于其外部訪問是私有的,所以就無法建立外部類對象,進(jìn)而也無法建立內(nèi)部

37、類對象。 局部內(nèi)部類:在方法中定義的內(nèi)部類稱為局部內(nèi)部類。與局部變量類似,在局部內(nèi)部類前不加修飾符public和private,其范圍為定義它的代碼塊。注意:局部內(nèi)部類不僅可以訪問外部類實例變量,還可以訪問外部類的局部變量(但此時要求外部類的局部變量必須為final)?在類外不可直接生成局部內(nèi)部類(保證局部內(nèi)部類對外是不可見的)。要想使用局部內(nèi)部類時需要生成對象,對象調(diào)用方法,在方法中才能調(diào)用其局部內(nèi)部類。 靜態(tài)內(nèi)部類:(注意:前三種內(nèi)部類與變量類似,所以可以對照參考變量)靜態(tài)內(nèi)部類定義在類中,任何方法外,用static定義。靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員。生成(new)一個靜態(tài)內(nèi)部類不需

38、要外部類成員:這是靜態(tài)內(nèi)部類和成員內(nèi)部類的區(qū)別。靜態(tài)內(nèi)部類的對象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態(tài)內(nèi)部類成為了一個頂級類。靜態(tài)內(nèi)部類不可用private來進(jìn)行定義。例子:對于兩個類,擁有相同的方法:People run();Machine run();此時有一個robot類:class Robot extends People implement Machine.此時run()不可直接實現(xiàn)。注意:當(dāng)類與接口(或者是接口與接口)發(fā)生方法命名沖突的時候,此時必須使用內(nèi)部類來實現(xiàn)。用接口不能完全地實現(xiàn)多繼

39、承,用接口配合內(nèi)部類才能實現(xiàn)真正的多繼承。 匿名內(nèi)部類(必須掌握):匿名內(nèi)部類是一種特殊的局部內(nèi)部類,它是通過匿名類實現(xiàn)接口。IA被定義為接口。IA I=new IA();注:一個匿名內(nèi)部類一定是在new的后面,用其隱含實現(xiàn)一個接口或?qū)崿F(xiàn)一個類,沒有類名,根據(jù)多態(tài),我們使用其父類名。因其為局部內(nèi)部類,那么局部內(nèi)部類的所有限制都對其生效。匿名內(nèi)部類是唯一一種無構(gòu)造方法類。匿名內(nèi)部類在編譯的時候由系統(tǒng)自動起名Out$1.class。如果一個對象編譯時的類型是接口,那么其運行的類型為實現(xiàn)這個接口的類。因匿名內(nèi)部類無構(gòu)造方法,所以其使用范圍非常的有限。(下午:)Exception(例外/異常)(教程上

40、的MODEL7)對于程序可能出現(xiàn)的錯誤應(yīng)該做出預(yù)案。例外是程序中所有出乎意料的結(jié)果。(關(guān)系到系統(tǒng)的健壯性)JAVA會將所有的錯誤封裝成為一個對象,其根本父類為Throwable。Throwable有兩個子類:Error和Exception。一個Error對象表示一個程序錯誤,指的是底層的、低級的、不可恢復(fù)的嚴(yán)重錯誤。此時程序一定會退出,因為已經(jīng)失去了運行所必須的物理環(huán)境。對于Error錯誤我們無法進(jìn)行處理,因為我們是通過程序來應(yīng)對錯誤,可是程序已經(jīng)退出了。我們可以處理的Throwable對象中只有Exception對象(例外/異常)。Exception有兩個子類:Runtime excepti

41、on(未檢查異常)非Runtime exception(已檢查異常)(注意:無論是未檢查異常還是已檢查異常在編譯的時候都不會被發(fā)現(xiàn),在編譯的過程中檢查的是程序的語法錯誤,而異常是一個運行時程序出錯的概念。)在Exception中,所有的非未檢查異常都是已檢查異常,沒有另外的異常!未檢查異常是因為程序員沒有進(jìn)行必要的檢查,因為他的疏忽和錯誤而引起的異常。一定是屬于虛擬機(jī)內(nèi)部的異常(比如空指針)。應(yīng)對未檢查異常就是養(yǎng)成良好的檢查習(xí)慣。已檢查異常是不可避免的,對于已檢查異常必須實現(xiàn)定義好應(yīng)對的方法。已檢查異??隙缭匠隽颂摂M機(jī)的范圍。(比如“未找到文件”)如何處理已檢查異常(對于所有的已檢查異常都要

42、進(jìn)行處理):首先了解異常形成的機(jī)制:當(dāng)一個方法中有一條語句出現(xiàn)了異常,它就會throw(拋出)一個例外對象,然后后面的語句不會執(zhí)行返回上一級方法,其上一級方法接受到了例外對象之后,有可能對這個異常進(jìn)行處理,也可能將這個異常轉(zhuǎn)到它的上一級。對于接收到的已檢查異常有兩種處理方式:throws和try方法。注意:出錯的方法有可能是JDK,也可能是程序員寫的程序,無論誰寫的,拋出一定用throw。例:public void print() throws Exception.對于方法a,如果它定義了throws Exception。那么當(dāng)它調(diào)用的方法b返回異常對象時,方法a并不處理,而將這個異常對象向上

43、一級返回,如果所有的方法均不進(jìn)行處理,返回到主方法,程序中止。(要避免所有的方法都返回的使用方法,因為這樣出現(xiàn)一個很小的異常就會令程序中止)。如果在方法的程序中有一行throw new Exception(),返回錯誤,那么其后的程序不執(zhí)行。因為錯誤返回后,后面的程序肯定沒有機(jī)會執(zhí)行,那么JAVA認(rèn)為以后的程序沒有存在的必要。對于trycatch格式:try 可能出現(xiàn)錯誤的代碼塊 catch(exception e)進(jìn)行處理的代碼 ; 對象變量的聲明用這種方法,如果代碼正確,那么程序不經(jīng)過catch語句直接向下運行;如果代碼不正確,則將返回的異常對象和e進(jìn)行匹配,如果匹配成功,則處理其后面的異

44、常處理代碼。(如果用exception來聲明e的話,因為exception為所有exception對象的父類,所有肯定匹配成功)。處理完代碼后這個例外就完全處理完畢,程序會接著從出現(xiàn)異常的地方向下執(zhí)行(是從出現(xiàn)異常的地方還是在catch后面呢?利用程序進(jìn)行驗證)。最后程序正常退出。Try中如果發(fā)現(xiàn)錯誤,即跳出try去匹配catch,那么try后面的語句就不會被執(zhí)行。一個try可以跟進(jìn)多個catch語句,用于處理不同情況。當(dāng)一個try只能匹配一個catch。我們可以寫多個catch語句,但是不能將父類型的exception的位置寫在子類型的excepiton之前,因為這樣父類型肯定先于子類型被匹

45、配,所有子類型就成為廢話。JAVA編譯出錯。在try,catch后還可以再跟一子句finally。其中的代碼語句無論如何都會被執(zhí)行(因為finally子句的這個特性,所以一般將釋放資源,關(guān)閉連接的語句寫在里面)。如果在程序中書寫了檢查(拋出)exception但是沒有對這個可能出現(xiàn)的檢查結(jié)果進(jìn)行處理,那么程序就會報錯。而如果只有處理情況(try)而沒有相應(yīng)的catch子句,則編譯還是通不過。如何知道在編寫的程序中會出現(xiàn)例外呢1 調(diào)用方法,查看API中查看方法中是否有已檢查錯誤。2 在編譯的過程中看提示信息,然后加上相應(yīng)的處理。Exception有一個message屬性。在使用catch的時候可

46、以調(diào)用:Catch(IOException e)System.out.println(e.message();Catch(IOException e)e.printStackTrace();上面這條語句回告訴我們出錯類型所歷經(jīng)的過程,在調(diào)試的中非常有用。開發(fā)中的兩個道理:如何控制try的范圍:根據(jù)操作的連動性和相關(guān)性,如果前面的程序代碼塊拋出的錯誤影響了后面程序代碼的運行,那么這個我們就說這兩個程序代碼存在關(guān)聯(lián),應(yīng)該放在同一個try中。 對已經(jīng)查出來的例外,有throw(積極)和try catch(消極)兩種處理方法。對于try catch放在能夠很好地處理例外的位置(即放在具備對例外進(jìn)行處理

47、的能力的位置)。如果沒有處理能力就繼續(xù)上拋。當(dāng)我們自己定義一個例外類的時候必須使其繼承excepiton或者RuntimeException。Throw是一個語句,用來做拋出例外的功能。而throws是表示如果下級方法中如果有例外拋出,那么本方法不做處理,繼續(xù)向上拋出。Throws后跟的是例外類型。斷言是一種調(diào)試工具(assert)其后跟的是布爾類型的表達(dá)式,如果表達(dá)式結(jié)果為真不影響程序運行。如果為假系統(tǒng)出現(xiàn)低級錯誤,在屏幕上出現(xiàn)assert信息。Assert只是用于調(diào)試。在產(chǎn)品編譯完成后上線assert代碼就被刪除了。方法的覆蓋中,如果子類的方法拋出的例外是父類方法拋出的例外的父類型,那么編

48、譯就會出錯:子類無法覆蓋父類。結(jié)論:子類方法不可比父類方法拋出更多的例外。子類拋出的例外或者與父類拋出的例外一致,或者是父類拋出例外的子類型?;蛘咦宇愋筒粧伋隼狻H绻割愋蜔othrows時,子類型也不允許出現(xiàn)throws。此時只能使用try catch。練習(xí):寫一個方法:int add(int a,int b) return a+b;當(dāng)a+b=100;拋出100為異常處理。12.02集合(從本部分開始涉及API)集合是指一個對象容納了多個對象,這個集合對象主要用來管理維護(hù)一系列相似的對象。數(shù)組就是一種對象。(練習(xí):如何編寫一個數(shù)組程序,并進(jìn)行遍歷。)java.util.*定義了一系列的接口和

49、類,告訴我們用什么類NEW出一個對象,可以進(jìn)行超越數(shù)組的操作。(注:JAVA1.5對JAVA1.4的最大改進(jìn)就是增加了對范型的支持)集合框架接口的分類:(分collection接口 和 map接口) Collection接口 Map接口List接口 Set接口 SortedMap接口 SortedSet接口JAVA中所有與集合有關(guān)的實現(xiàn)類都是這六個接口的實現(xiàn)類。Collection接口:集合中每一個元素為一個對象,這個接口將這些對象組織在一起,形成一維結(jié)構(gòu)。List接口代表按照元素一定的相關(guān)順序來組織(在這個序列中順序是主要的),List接口中數(shù)據(jù)可重復(fù)。Set接口是數(shù)學(xué)中集合的概念:其元素?zé)o

50、序,且不可重復(fù)。(正好與List對應(yīng))SortedSet會按照數(shù)字將元素排列,為“可排序集合”。Map接口中每一個元素不是一個對象,而是一個鍵對象和值對象組成的鍵值對(Key-Value)。Key-Value是用一個不可重復(fù)的key集合對應(yīng)可重復(fù)的value集合。(典型的例子是字典:通過頁碼的key值找字的value值)。例子:key1value1;key2value2;key3value3.SortedMap:如果一個Map可以根據(jù)key值排序,則稱其為SortedMap。(如字典)!注意數(shù)組和集合的區(qū)別:數(shù)組中只能存簡單數(shù)據(jù)類型。Collection接口和Map接口只能存對象。以下介紹接口

51、:List接口:(介紹其下的兩個實現(xiàn)類:ArrayList和LinkedList)ArrayList和數(shù)組非常類似,其底層也用數(shù)組組織數(shù)據(jù),ArrayList是動態(tài)可變數(shù)組。 底層:指存儲格式。說明ArrayList對象都是存在于數(shù)組中。注:數(shù)組和集合都是從下標(biāo)0開始。ArrayList有一個add(Object o)方法用于插入數(shù)組。ArrayList的使用:(完成這個程序)先import java.util.*;用ArrayList在一個數(shù)組中添加數(shù)據(jù),并遍歷。ArrayList中數(shù)組的順序與添加順序一致。只有List可用get和size。而Set則不可用(因其無序)。Collection

52、接口都是通過Iterator()(即迭代器)來對Set和List遍歷。通過語句:Iterator it=c.iterator(); 得到一個迭代器,將集合中所有元素順序排列。然后可以通過interator方法進(jìn)行遍歷,迭代器有一個游標(biāo)(指針)指向首位置。Interator有hasNext(),用于判斷元素右邊是否還有數(shù)據(jù),返回True說明有。然后就可以調(diào)用next動作。Next()會將游標(biāo)移到下一個元素,并把它所跨過的元素返回。(這樣就可以對元素進(jìn)行遍歷)練習(xí):寫一個程序,輸入對象信息,比較基本信息。集合中每一個元素都有對象,如有字符串要經(jīng)過強(qiáng)制類型轉(zhuǎn)換。Collections是工具類,所有方

53、法均為有用方法,且方法為static。有Sort方法用于給List排序。Collections.Sort()分為兩部分,一部分為排序規(guī)則;一部分為排序算法。規(guī)則用來判斷對象;算法是考慮如何排序。對于自定義對象,Sort不知道規(guī)則,所以無法比較。這種情況下一定要定義排序規(guī)則。方式有兩種: java.lang下面有一個接口:Comparable(可比較的)可以讓自定義對象實現(xiàn)一個接口,這個接口只有一個方法comparableTo(Object o)其規(guī)則是當(dāng)前對象與o對象進(jìn)行比較,其返回一個int值,系統(tǒng)根據(jù)此值來進(jìn)行排序。如 當(dāng)前對象>o對象,則返回值>0;(可將返回值定義為1)如

54、當(dāng)前對象=o對象,則返回值=0;如 當(dāng)前對象<o對象,則返回值0。(可將返回值定義為-1)看TestArraylist的java代碼。我們通過返回值1和-1位置的調(diào)換來實現(xiàn)升序和降序排列的轉(zhuǎn)換。 java.util下有一個Comparator(比較器)它擁有compare(),用來比較兩個方法。要生成比較器,則用Sort中Sort(List,List(Compate))第二種方法更靈活,且在運行的時候不用編譯。注意:要想實現(xiàn)comparTo()就必須在主方法中寫上implement comparable.練習(xí):生成一個EMPLOYEE類,然后將一系列對象放入到ArrayList。用Iterator遍歷,排序之后,再進(jìn)行遍歷。集合的最大缺點是無法進(jìn)行類型判定(這個缺點在JAVA1.5中已經(jīng)解決),這樣就可能出現(xiàn)因為類型不同而出現(xiàn)類型錯誤。解決的方法是添加類型的判斷。LinkedList接口(在代碼的使用過程中和ArrayList沒有什么區(qū)別)ArrayList底層是object數(shù)組

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論