java-面向?qū)ο蟾呒?jí)程序設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、《Java程序設(shè)計(jì)之網(wǎng)絡(luò)編程》,,教學(xué)課件,第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì),主要內(nèi)容,5.1 繼承 5.2多態(tài)性5.3 抽象類和抽象方法5.4接口5.5內(nèi)部類和匿名類,,5.1 繼承,5.1.1 創(chuàng)建子類5.1.2 成員變量的隱藏和方法的重寫5.1.3 super5.1.4 對(duì)象的上轉(zhuǎn)型對(duì)象,,5.1.1 創(chuàng)建子類,繼承是一種由已有的類創(chuàng)建新類的機(jī)制。利用繼承,我們可以先創(chuàng)建一個(gè)擁有共同屬性的一般類,根據(jù)該一般

2、類再創(chuàng)建具有特殊屬性的新類。由繼承而得到的類稱為子類(subclass), 被繼承的類稱為父類(或叫超類,superclass)。直接或間接被繼承的類都是父類。子類繼承父類的狀態(tài)和行為,同時(shí)也可以修改父類的狀態(tài)或重寫父類的行為,并添加新的狀態(tài)和行為。Java中不支多重繼承。,5.1.1 創(chuàng)建子類,通過(guò)在類的聲明中加入extends子句來(lái)創(chuàng)建一個(gè)類的子類,其格式如下: class SubClass extends SuperCla

3、ss{ …… } 上面的代碼把SubClass聲明為SuperClass的直接子類。如果SuperClass又是某個(gè)類的子類,則SubClass同時(shí)也是該類的(間接)子類。子類可以繼承父類的成員變量和方法。如果缺省extends子句,則該類為java.lang.Object的子類。子類可以繼承父類中訪問(wèn)權(quán)限設(shè)定為public、protected、default的成員變量和方法。但是不能繼承訪問(wèn)權(quán)限為private的

4、成員變量和方法。,5.1.1 創(chuàng)建子類,5.1.1 創(chuàng)建子類,5.1.1 創(chuàng)建子類,注意,MammalClass類擁有來(lái)自于DogClass和CatClass的相同屬性,包括了name、eyeColor、age等?,F(xiàn)在我們可以利用繼承重寫DogClass和CatClass。public class DogClass extends MammalClass { boolean hasTail; // name,eye

5、Color已經(jīng)從父類繼承 public DogClass() { //隱式調(diào)用super() name="Chase"; eyeColor="Black"; age=2; hasTail=true; } },5.1.1 創(chuàng)建子類,【例5-1】 繼承的簡(jiǎn)單例子class Father{

6、 //父類private int money;float weight,height;String head;String speak(String s) {return s ;}}class Son extends Father{ //子類String hand ,foot;},Weight,height,head,Speak();Hand,foot,5.1.1 創(chuàng)建子類,【例5-

7、1】 繼承的簡(jiǎn)單例子public class TestExtend { public static void main(String args[]){ Son boy=new Son(); boy.weight=120f; boy.height=1.8f; boy.head="一個(gè)頭"; boy.hand="兩只手";

8、boy.foot="兩只腳"; System.out.println("我是兒子"); System.out.println("我有:"+boy.hand+"、"+boy.foot+"、"+ boy.head+"、重"+boy.weight+"、高"+boy.height)

9、;}} 上面程序運(yùn)行結(jié)果如下:我是兒子我有:兩只手、兩只腳、一個(gè)頭、重120.0、高1.8,5.1.1 創(chuàng)建子類,如果子類和父類不在同一個(gè)包中,那么,子類可以繼承了父類的protected、public修飾的成員變量做為子類的成員變量,并且也可以繼承了父類的protected、 public 修飾的方法作為子類的方法。另外子類和父類不在同一個(gè)包中,則子類不能繼承父類的default變量和default方法。,5.1.1 創(chuàng)建子

10、類,,【例5-2】繼承不同包中的類的簡(jiǎn)單例子// HouseHold.javapackage xing.house;public class HouseHold { //家類protected String address; //地址 public String surnname; //姓 String givenname; //名 public HouseHold(Strin

11、g add) { address =add;}protected String getAddress(){return address;}void setMoney(String newadd) {address=newadd;}void setAddress(String add){address=add;}},5.1.1 創(chuàng)建子類,,// Mikey.java:package xing.friend;import x

12、ing.house.HouseHold;public class Mikey extends HouseHold { public Mikey(){ super("Star flight street 110"); }public static void main(String args[]){ Mikey mikey=new Mikey(); //mikey.givenname=“Johnson

13、”; //非法 mikey.surnname="Math"; //合法. mikey.address="Star flight street 110"; //合法. String m=mikey.getAddress(); //合法 //mikey.setAddress("Star flight street

14、 110"); //非法. System.out.println(mikey.surnname+":"+m); }},5.1.1 創(chuàng)建子類,,// Mikey.java:package xing.friend;import xing.house.HouseHold;public class Mikey extends HouseHold { public Mikey(){ supe

15、r("Star flight street 110"); }public static void main(String args[]){ Mikey mikey=new Mikey(); //mikey.givenname=“Johnson”; //非法 mikey.surnname="Math"; //合法. mikey.addres

16、s="Star flight street 110"; //合法. String m=mikey.getAddress(); //合法 //mikey.setAddress("Star flight street 110"); //非法. System.out.println(mikey.surnname+":"+m); }},5.

17、1.1 創(chuàng)建子類,,程序編譯和運(yùn)行過(guò)程如下:,5.1.2 成員變量的隱藏和方法的重寫,,當(dāng)我們?cè)谧宇愔卸x的成員變量和父類中的成員變量同名時(shí),此時(shí)稱子類的成員變量隱藏了父類的成員變量。當(dāng)子類中定義了一個(gè)方法,并且這個(gè)方法的名字,返回類型,參數(shù)個(gè)數(shù)以及類型和父類的某個(gè)方法完全相同時(shí),父類的這個(gè)方法將被隱藏,這時(shí)我們說(shuō)重寫了父類的方法。 子類通過(guò)成員變量的隱藏和方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。,5.1.2

18、成員變量的隱藏和方法的重寫,,例如下面的這段程序就是這樣的情況:class SuperClass { //父類 int y; void setY(){ y=0; } }class SubClass extends SuperClass{ int y; // 父類變量y被隱藏 void setY(){ // 重寫父類的方法se

19、tY() y=1; } },5.1.3 super,,5.1.3 super 子類在隱藏了父類的成員變量或重寫了父類的方法后,常常還要用到父類的成員變量,或在重寫的方法中使用父類中被重寫的方法以簡(jiǎn)化代碼的編寫,這時(shí)就要訪問(wèn)父類的成員變量或調(diào)用父類的方法,Java中通過(guò)super來(lái)實(shí)現(xiàn)對(duì)父類成員的訪問(wèn)。我們知道,this用來(lái)引用當(dāng)前對(duì)象,與this類似,super用來(lái)引用當(dāng)前對(duì)象的父類。su

20、per的使用可以分為下面三種情況: 1)用來(lái)訪問(wèn)父類被隱藏的成員變量,如: super.variable 2)用來(lái)調(diào)用父類中被重寫的方法,如: super.Method([paramlist]): 3)用來(lái)調(diào)用父類的構(gòu)造方法,如: super([paramlist]);,5.1.3 super,,,【例5-3】調(diào)用父類的構(gòu)造方法的例子class A {

21、 //類A public int n; //公共類型的成員變量 public A(){ } public A(int n){ this.n = n; } int method(){ return n; } }public class B extends A { //類B public B(){ super(15); } public static void

22、main(String args[]){ A aInstance = new B( ); int b=aInstance.method(); System.out.println("類A中的成員變量:"+b); }},5.1.4對(duì)象的上轉(zhuǎn)型對(duì)象,,,假設(shè)A 類是B 類的父類, class b extends B{}當(dāng)我們用子類創(chuàng)建一個(gè)對(duì)象,并把這個(gè)對(duì)象的引用放到父類的對(duì)象中時(shí),

23、例如 A a; A a=new B(); 或 A a; B b=new B(); a=b;稱這個(gè)父類對(duì)象a,是子類對(duì)象b的上轉(zhuǎn)型對(duì)象。,5.1.4對(duì)象的上轉(zhuǎn)型對(duì)象,,,對(duì)象的上轉(zhuǎn)型對(duì)象的實(shí)體是子類負(fù)責(zé)創(chuàng)建的,但上轉(zhuǎn)型對(duì)象會(huì)失去原對(duì)象的一些屬性和功能.上轉(zhuǎn)型對(duì)象具有如下特點(diǎn): 1)上轉(zhuǎn)型對(duì)象不能操作子類新增的成員變量和子類新增的方法。 2)上轉(zhuǎn)型對(duì)象可以操作子類繼承或重寫的成員變量,也可以使用

24、子類繼承的或重寫的方法。 3)如果子類重寫了父類的某個(gè)方法后,當(dāng)對(duì)象的上轉(zhuǎn)對(duì)象調(diào)用這個(gè)方法時(shí)一定是調(diào)用了這個(gè)重寫的方法,因?yàn)槌绦蛟谶\(yùn)行時(shí)知道,這個(gè)上轉(zhuǎn)對(duì)象的實(shí)體是子類創(chuàng)建的,只不過(guò)損失了一些功能而已。 不要將父類創(chuàng)建的對(duì)象和子類對(duì)象的上轉(zhuǎn)型對(duì)象相混淆。 上轉(zhuǎn)型對(duì)象在Java編程中是常見(jiàn)的。 可以將對(duì)象的上轉(zhuǎn)型對(duì)象再?gòu)?qiáng)制轉(zhuǎn)換到一個(gè)子類對(duì)象,這時(shí),該子類對(duì)象又具備了子類所給的所有屬性和功能。,5.1.4對(duì)象的

25、上轉(zhuǎn)型對(duì)象,,,【例5-5】 上轉(zhuǎn)型對(duì)象的使用class Mammal{ //哺乳動(dòng)物類 private int n=40; void crySpeak(String s) { System.out.println(s); }}public class Monkey extends Mammal{ // 猴子類 void computer(int aa,int bb) { int cc=aa*b

26、b; System.out.println(cc);} void crySpeak(String s) {System.out.println("**"+s+"**");} public static void main(String args[]){ Mammal mammal=new Monkey(); // mammal是Monkey類的對(duì)象的上轉(zhuǎn)型對(duì)象.

27、 mammal.crySpeak("I love this game"); // mammal.computer(10,10); Monkey monkey=(Monkey)mammal; //把上轉(zhuǎn)型對(duì)象強(qiáng)制轉(zhuǎn)化為子類的對(duì)象. monkey.computer(10,10); }},5.1.4對(duì)象的上轉(zhuǎn)型對(duì)象,,,上述程序的運(yùn)行結(jié)果為:**I love this game**

28、100在上述例子中,上轉(zhuǎn)對(duì)象mammal調(diào)用方法:mammal.crySpeak("I love this game");得到的結(jié)果是”**I love this game**”.而不是”I love this game”。因?yàn)閙ammal調(diào)用的是子類重寫的方法crySpeak.在main()中,如果出現(xiàn)下面的兩行代碼,那將是錯(cuò)誤的:mammal.n=1000; //因?yàn)樽宇惐緛?lái)就沒(méi)

29、有繼承n。 mammal.computer(10,10); //因?yàn)閏omputer方法是子類新增的方法。,第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì),5.1 繼承 5.2多態(tài)性5.3 抽象類和抽象方法5.4接口5.5內(nèi)部類和匿名類,,5.2多態(tài)性,多態(tài)(Polymorphism)的意思就是用相同的名字來(lái)定義不同的方法。在Java中,普通類型的多態(tài)為重載,這就意味著可以使幾個(gè)不同的方法使用相同的名字,這些方法以參數(shù)的個(gè)數(shù)不同、參數(shù)的

30、類型不同等方面來(lái)進(jìn)行區(qū)分,以使得編譯器能夠進(jìn)行識(shí)別。 也可以這樣講,重載是同一個(gè)方法具有不同的版本,每個(gè)版本之間在參數(shù)特征方面有差異。重載是Java實(shí)現(xiàn)多態(tài)性的方式之一。 例如:family()方法可以有三個(gè)版本,如下: family() { } family(String ch) { address=ch; } family(String ch

31、,float n) { address=ch; pay=n; } 這些方法并存于程序中,編譯時(shí),編譯器根據(jù)實(shí)參的類型和個(gè)數(shù)來(lái)區(qū)分從而調(diào)用那個(gè)方法。如果這些方法作為函數(shù)或過(guò)程同時(shí)出現(xiàn)在其它語(yǔ)言的程序中,如C,那將導(dǎo)致災(zāi)難性的錯(cuò)誤。,5.2多態(tài)性,【例5-6】構(gòu)造方法重載的例子class person { String name="Johnson"; // 姓名 int age=45

32、; // 年齡 person(){ } person(String a) {name=a; } person(String a,int b) { name=a; age=b; } public voiddisplay(){ System.out.println("Name="+ name+&

33、quot;,"+"Age="+age); } }public class Poly{ public static void main(String[] args) { person ko1=new person(); person ko2=new person("Mike"); person ko3=new person(

34、"Willian",50); ko1.display(); ko2.display(); ko3.display(); } },5.2多態(tài)性,在Java語(yǔ)言中,多態(tài)性主要體現(xiàn)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性(編譯時(shí)多態(tài))和方法重寫實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)多態(tài)),如下:  1) 編譯時(shí)多態(tài)  在編譯階段,具體調(diào)用哪個(gè)被重載的方法,編譯器會(huì)根據(jù)參數(shù)的不同來(lái)靜態(tài)

35、確定調(diào)用相應(yīng)的方法?! ?) 運(yùn)行時(shí)多態(tài)  由于子類繼承了父類所有的屬性(私有的除外),所以子類對(duì)象可以作為父類對(duì)象使用。程序中凡是使用父類對(duì)象的地方,都可以用子類對(duì)象來(lái)代替。一個(gè)對(duì)象可以通過(guò)引用子類的實(shí)例來(lái)調(diào)用子類的方法。 如果子類重寫了父類的方法,那么重寫方法的調(diào)用原則如下:Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例,來(lái)決定調(diào)用哪個(gè)方法。對(duì)子類的一個(gè)實(shí)例,如果子類重寫了父類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;如果子類

36、繼承了父類的方法(未重寫),則運(yùn)行時(shí)系統(tǒng)調(diào)用父類的方法。 另外,方法重寫時(shí)應(yīng)遵循的原則如下:改寫后的方法不能比被重寫的方法有更嚴(yán)格的訪問(wèn)權(quán)限。改寫后的方法不能比被重寫的方法產(chǎn)生更多的異常。 進(jìn)行方法重寫時(shí)必須遵從這兩個(gè)原則,否則編譯器會(huì)指出程序出錯(cuò)。,5.2多態(tài)性,【例5-7】方法重寫的例子class Parent{ public void function(){ System.out.prin

37、tln("I am in Parent!"); } } class Child extends Parent{ private void function(){ System.out.println("I am in Child!"); } } public class RTpolyTest{ public static

38、void main(String args[]){ Parent pl=new Parent( ); Parent p2=new Child( ); p1.function( ); p2.function( ); } },5.2多態(tài)性,編譯過(guò)程如下:D:\user\chap05>Javac RTpolyTest.javaRTpolyTest.java:8: funct

39、ion() in Child cannot override function() in Parent; attempting to assign weaker access privileges; was public private void function(){ ^RTpolyTest.java:16: cannot find symbolsymbol : variable p1

40、location: class RTpolyTest p1.function( ); ^2 errors可以看出,該程序中實(shí)例p2調(diào)用function()方法時(shí)會(huì)導(dǎo)致訪問(wèn)權(quán)限的沖突。,第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì),5.1 繼承 5.2多態(tài)性5.3 抽象類和抽象方法5.4接口5.5內(nèi)部類和匿名類,,第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì),5.1 繼承 5.2多態(tài)性5.3 抽象類和抽象方法5.4

41、接口5.5內(nèi)部類和匿名類,,5.3 抽象類和抽象方法,,Java語(yǔ)言中,用abstract關(guān)鍵字來(lái)修飾一個(gè)類時(shí),這個(gè)類叫做抽象類。一個(gè)abstract 類只關(guān)心它的子類是否具有某種功能,并不關(guān)心該功能的具體實(shí)現(xiàn),功能的具體行為由子類負(fù)責(zé)實(shí)現(xiàn)的。例如: public abstract class Drawing { public abstract void drawDot(int x, int y); public

42、void drawLine(int x1, int y1,int x2, int y2) { ………… } } 用abstract來(lái)修飾一個(gè)方法時(shí),該方法叫做抽象方法。與final類和方法相反,abstract類必須被繼承,abstract方法必須被重寫。,5.3 抽象類和抽象方法,,當(dāng)一個(gè)類的定義完全表示抽象的概念時(shí),它不應(yīng)該被實(shí)例化為一個(gè)對(duì)象。例如Java中的Number類就是一個(gè)抽象類,它只表

43、示數(shù)字這一抽象概念,只有當(dāng)它作為整數(shù)類Integer或?qū)崝?shù)類Float等的父類時(shí)才有意義。定義一個(gè)抽象類的格式如下: abstract class abstractClass{ …… } 由于抽象類不能被實(shí)例化,因此下面的語(yǔ)句會(huì)產(chǎn)生編譯錯(cuò)誤: new abstractClass(); 抽象類中可以包含抽象方法,為所有子類定義一個(gè)統(tǒng)一的接口,對(duì)抽象方法只需聲明,而不需實(shí)現(xiàn),因此

44、它沒(méi)有方法體。其格式如下: abstrac returnType abstractMethod([paramlist));,5.3 抽象類和抽象方法,,【例5-8】使用abstract的另一例子abstract class AA{ abstract void callme( ); void metoo( ){ System.out.println("InsideA's metoo(

45、) method"); } }class BB extends AA{ void callme( ){ System.out.println("Inside B's callme() method"); }}public class AAbstract{ public static void main(String args[]){ AA cc=new BB

46、(); //cc為上轉(zhuǎn)型對(duì)象 cc.callme(); cc.metoo(); }},第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì),5.1 繼承 5.2多態(tài)性5.3 抽象類和抽象方法5.4接口5.5內(nèi)部類和匿名類,,5.4 接口,5.4.1接口聲明5.4.2使用接口的優(yōu)點(diǎn),,5.4.1接口聲明,,從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)。通過(guò)接口使得處于不同層

47、次,甚至互不相關(guān)的類可以具有相同的行為。接口其實(shí)就是方法定義和常量值的集合。它的優(yōu)點(diǎn)主要體現(xiàn)在下面幾個(gè)方面:(1)通過(guò)接口可以實(shí)現(xiàn)不相關(guān)類的相同行為,而不需要考慮這些類之間的層次關(guān)系。(2)通過(guò)接口可以指明多個(gè)類需要實(shí)現(xiàn)的方法。(3)通過(guò)接口可以了解對(duì)象的交互界面,而不需了解對(duì)象所對(duì)應(yīng)的類。接口把方法的定義和類的層次區(qū)分開(kāi)來(lái),通過(guò)它可以在運(yùn)行時(shí)動(dòng)態(tài)地定位所調(diào)用的方法。同時(shí)接口中可以實(shí)現(xiàn)“多重繼承”,且一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。正

48、是這些機(jī)制使得接口提供了比多重繼承(如C++等語(yǔ)言)更簡(jiǎn)單、更靈活、而且更強(qiáng)勁的功能。,5.4.1接口聲明,,Java 不支持多繼承性,即一個(gè)類只能有一個(gè)父類。單繼承性使得Java類層次簡(jiǎn)單,易于程序的管理。為了克服單繼承的缺點(diǎn),Java使用了接口,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。使用關(guān)鍵字interface 來(lái)定義一個(gè)接口。接口的定義和類的定義很相似,分為接口聲明和接口體兩部分。1、 接口聲明我們?cè)褂胏lass關(guān)鍵字來(lái)聲明類,接口通過(guò)

49、使用關(guān)鍵自interface 來(lái)聲明. 完整的接口定義格式如下:[public] interface interfaceName [extends listOfSuperInterface]{……}其中public修飾符指明任意類均可以使用這個(gè)接口,缺省情況下,只有與該接口定義在同一個(gè)包中的類才可以訪問(wèn)這個(gè)接口。extends子句與類聲明中的extends子句基本相同,不同的是一個(gè)接口可以有多個(gè)父接口,用逗號(hào)隔開(kāi),而一個(gè)類只

50、能有一個(gè)父類。子接口繼承父接口中所有的常量和方法。 通常接口名稱以able或ible結(jié)尾,表明接口能完成一定的行為,例如Runnable、Serializable。,5.4.1接口聲明,,2、 接口體接口體中包含常量定義和方法定義兩部分。其中常量定義部分定義的常量均具有public、static和final屬性。其格式如下: returnType methodName([paramlist]);接口中只能進(jìn)行方法的聲明,

51、而不提供方法的實(shí)現(xiàn),所以,方法定義沒(méi)有方法體,且用分號(hào)(;)結(jié)尾,在接口中聲明的方法具有public和abstract屬性。另外,如果在子接口中定義了和父接口同名的常量,則父接口中的常量被隱藏。例如:interface Summaryable {final int MAX=50; // MAX具有public、static、final屬性void printone(float x);float sum(float x ,fl

52、oat y);}上面這段程序可以以Summaryable.java來(lái)保存,也可以寫入其它Java程序中。,5.4.1接口聲明,,3、接口的使用一個(gè)類通過(guò)使用關(guān)鍵字implements 聲明自己使用(或?qū)崿F(xiàn))一個(gè)或多個(gè)接口。如果使用多個(gè)接口,用逗號(hào)隔開(kāi)接口名。如 class Calculate extends Computer implements Summary,Substractable{……}類Calculate

53、使用了Summary 和Substractable接口,繼承了Computer類。如果一個(gè)類使用了某個(gè)接口,那么這個(gè)類必須實(shí)現(xiàn)該接口的所有方法,即為這些方法提供方法體。需要注意的如下:1)在類中實(shí)現(xiàn)接口的方法時(shí),方法的名字,返回類型,參數(shù)個(gè)數(shù)及類型必須與接口中的完全一致。2)接口中的方法被默認(rèn)是public ,所以類在實(shí)現(xiàn)接口方法時(shí),一定要用public 來(lái)修飾。3)另外,如果接口的方法的返回類型如果不是void 的,那么在類中

54、實(shí)現(xiàn)該接口方法時(shí),方法體至少要有一個(gè)return 語(yǔ)句。如果是void 型,類體除了兩個(gè)大括號(hào)外,也可以沒(méi)有任何語(yǔ)句.,5.4.2使用接口的優(yōu)點(diǎn),,從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)。通過(guò)接口使得處于不同層次,甚至互不相關(guān)的類可以具有相同的行為。接口其實(shí)就是方法定義和常量值的集合。 它的優(yōu)點(diǎn)主要體現(xiàn)在下面幾個(gè)方面: (1)通過(guò)接口可以實(shí)現(xiàn)不相關(guān)類的相同行為,而不

55、需要考慮這些類之間的層次關(guān)系。 (2)通過(guò)接口可以指明多個(gè)類需要實(shí)現(xiàn)的方法。 (3)通過(guò)接口可以了解對(duì)象的交互界面,而不需了解對(duì)象所對(duì)應(yīng)的類。接口把方法的定義和類的層次區(qū)分開(kāi)來(lái),通過(guò)它可以在運(yùn)行時(shí)動(dòng)態(tài)地定位所調(diào)用的方法。同時(shí)接口中可以實(shí)現(xiàn)“多重繼承”,且一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。正是這些機(jī)制使得接口提供了比多重繼承(如C++等語(yǔ)言)更簡(jiǎn)單、更靈活、而且更強(qiáng)勁的功能。,5.4.2使用接口的優(yōu)點(diǎn),,【例5-9】 使用多重接口

56、的例子// MultInterfaces.javainterface I1 { abstract void test(int i); }interface I2 { abstract void test(String s); }public class MultInterfaces implements I1, I2 { public void test(int i) { System.out.println

57、("In MultInterfaces.I1.test"); } public void test(String s) { System.out.println("In MultInterfaces.I2.test"); } public static void main(String[] a) { MultInterfaces t = new MultInterf

58、aces(); t.test(42); t.test("Hello"); }},第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì),5.1 繼承 5.2多態(tài)性5.3 抽象類和抽象方法5.4接口5.5內(nèi)部類和匿名類,,5.5內(nèi)部類和匿名類,5.5.1 內(nèi)部類的定義5.5.2 內(nèi)部類特性5.5.3 匿名類,,5.5.1 內(nèi)部類的定義,,簡(jiǎn)單地說(shuō),一個(gè)類被嵌套定義于另一個(gè)類中,稱為嵌套類。在大多數(shù)情

59、況下,嵌套類( 靜態(tài)的嵌套類除外)就是內(nèi)部類(inner class)。包含內(nèi)部類的類稱為外部類。與一般的類相同,內(nèi)部類具有自己的成員變量和成員方法。通過(guò)建立內(nèi)部類的對(duì)象,可以存取其成員變量和調(diào)用其成員方法。例如下面的例子:pubic class GroupOne{ int count; //外部類的成員變量 public class Student{ //聲明內(nèi)部類 Strin

60、g name; //內(nèi)部類的成員變量 public void output(){ //內(nèi)部類的成員方法 System.out.println(this.name+" "); } } },5.5.1 內(nèi)部類的定義,,實(shí)際上,Java語(yǔ)言規(guī)范對(duì)于內(nèi)部類有如下的規(guī)定: 在另一個(gè)類或者一個(gè)接口中聲明一個(gè)類。 在另一個(gè)接口或者一個(gè)類中聲明一個(gè)接

61、口。在一個(gè)方法中聲明一個(gè)類。類和接口聲明可嵌套任意深度。 從上面的規(guī)定中我們可以看出,內(nèi)部類的定義是非常靈活的。,5.5.2內(nèi)部類特性,,內(nèi)部類有如下特性:一般用在定義它的類或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給 出完整的名稱。名稱不能與包含它的類名相同??梢允褂冒耐獠款惖撵o態(tài)成員變量和實(shí)例成員變量,也可以使用它所在方法的局部變量。可以定義為abstract??梢月暶鳛閜rivate或protected。

62、若被聲明為static,就變成了頂層類,不能再使用局部變量。若想在內(nèi)部類中聲明任何static成員,則該內(nèi)部類必須聲明為static。Java將內(nèi)部類作為外部類的一個(gè)成員,就如同成員變量和成員方法一樣。因此外部類與內(nèi)部類的訪問(wèn)原則是:在外部類中,通過(guò)一個(gè)內(nèi)部類的對(duì)象引用內(nèi)部類中的成員;反之,在內(nèi)部類中可以直接引用它的外部類的成員,包括靜態(tài)成員、實(shí)例成員及私有成員。,5.5.2內(nèi)部類特性,,【例5-10】 內(nèi)部類和外部類之間的訪問(wèn)

63、 本例的類GroupTwo中聲明了成員變量count、內(nèi)部類Student、實(shí)例方法output和main方法,在內(nèi)部類Student中聲明了構(gòu)造方法和output方法,構(gòu)造方法存取了外部類GroupTwo的成員變量count。程序運(yùn)行結(jié)果:Johnson count=1 本例演示嵌套的兩個(gè)類之間的訪問(wèn)規(guī)則,即在外部類GroupTwo中,通過(guò)一個(gè)內(nèi)部類Student的對(duì)象s1可以引用內(nèi)部類中的成員;反之

64、,在內(nèi)部類Student中可以直接引用它的外部類的成員,如count。 本例的外部類GroupTwo中有實(shí)例方法output(),內(nèi)部類Student中也有實(shí)例方法output(),兩者雖然同名,卻表達(dá)不同含義。使用時(shí),外部類GroupTwo的對(duì)象調(diào)用GroupTwo的output,如g2.output(),內(nèi)部類Student的對(duì)象調(diào)用Student的output,如s1.output()。,5.5.2內(nèi)部類特性,,,pub

65、lic class GroupTwo{ //例5-10 private int count; //外部類的私有成員變量 public class Student { //聲明內(nèi)部類 String name; public Student(String n1) { name=n1; count++;

66、 //存取其外部類的成員變量 } public void output(){ System.out.println(this.name); } } public void output(){ //外部類的實(shí)例成員方法 Student s1=new Student("Johnson"); //建

67、立內(nèi)部類對(duì)象" s1.output(); //通過(guò)s1調(diào)用內(nèi)部類的成員方法 System.out.println("count="+this.count); } public static void main(String args[]){ GroupTwo g2=new GroupTwo(); g2.output()

68、; }},5.5.2內(nèi)部類特性,,,【例5-11】 內(nèi)部類訪問(wèn)外部靜態(tài)變量【例5-12】 靜態(tài)公用內(nèi)部類【例5-13】 抽象內(nèi)部類【例5-14】?jī)?nèi)部接口【例5-15】局部?jī)?nèi)部類,5.5.3匿名類,匿名類是不能有名稱的類,所以沒(méi)辦法引用它們。必須在創(chuàng)建時(shí),作為new語(yǔ)句的一部分來(lái)聲明它們。 要采用另一種形式的new語(yǔ)句,如下所示:   new    

69、這種形式的new語(yǔ)句聲明一個(gè)新的匿名類,它對(duì)一個(gè)給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口。它還創(chuàng)建那個(gè)類的一個(gè)新實(shí)例,并把它作為語(yǔ)句的結(jié)果而返回。要擴(kuò)展的類和要實(shí)現(xiàn)的接口是new語(yǔ)句的操作數(shù),后跟匿名類的主體。 從技術(shù)上說(shuō),匿名類可被視為非靜態(tài)的內(nèi)部類,所以它們具有和方法內(nèi)部聲明的非靜態(tài)內(nèi)部類一樣的權(quán)限和限制。    有關(guān)匿名類的使用詳見(jiàn)本書第12章本分內(nèi)容。內(nèi)部和匿名類是J

溫馨提示

  • 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論