Java程序設(shè)計(jì)系列講座-3_第1頁(yè)
Java程序設(shè)計(jì)系列講座-3_第2頁(yè)
Java程序設(shè)計(jì)系列講座-3_第3頁(yè)
Java程序設(shè)計(jì)系列講座-3_第4頁(yè)
Java程序設(shè)計(jì)系列講座-3_第5頁(yè)
已閱讀5頁(yè),還剩56頁(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ì)系列講座程序設(shè)計(jì)系列講座3OOP之繼承性與多態(tài)性之繼承性與多態(tài)性黃紹輝廈門(mén)大學(xué)計(jì)算機(jī)科學(xué)系E-mail: 來(lái)點(diǎn)輕松的話題:來(lái)點(diǎn)輕松的話題:Java命名規(guī)范命名規(guī)范包的命名規(guī)范包的命名規(guī)范包的名稱一般全部采用小寫(xiě)包名的前綴一般是域名單詞序列的逆序?qū)嵗齝om.sun.engcom.apple.quicktimeedu.cmu.cs.bovik.cheese文件的命名規(guī)范文件的命名規(guī)范 必須與該文件中public類的類名同名 后綴必須是 .java類類/ /接口的命名規(guī)范接口的命名規(guī)范 類名一般是名詞/名詞詞組:每個(gè)單詞的首字母大寫(xiě),其它字母小寫(xiě) 類名應(yīng)當(dāng)盡量簡(jiǎn)單,而且其含義能夠盡量

2、準(zhǔn)確地刻畫(huà)該類的含義 一般采用全稱盡量少用縮寫(xiě)詞 (除非該縮寫(xiě)詞被廣泛使用) 實(shí)例 Clock Time ImageSprite方法的命名規(guī)范方法的命名規(guī)范 方法名一般是 動(dòng)詞/動(dòng)詞性詞組 首字母小寫(xiě) 中間單詞的首字母大寫(xiě),其它字母小寫(xiě) 盡量應(yīng)用簡(jiǎn)單的、常用的單詞 實(shí)例 run( ); getBackground( ); getTime( );變量的命名規(guī)范變量的命名規(guī)范 變量名的首字母小寫(xiě) 中間單詞的首字母大寫(xiě),其它字母小寫(xiě) 變量名的首字母盡量不要用字符: _ 或 $ 變量名應(yīng)當(dāng)簡(jiǎn)短、有含義、且便于記憶 變量名常常由表示其所扮演的角色與數(shù)據(jù)類型組成 實(shí)例 int i; char c; dou

3、ble widthBox; Point startingPoint, centerPoint; Name loginName;常量的命名規(guī)范常量的命名規(guī)范 常量名一般全大寫(xiě),單詞之間用下劃線分隔 (“_”) 實(shí)例: static final int MIN_WIDTH = 4; static final int MAX_WIDTH = 999;編輯方法編輯方法 盡量不要用TAB排版 行數(shù)/每行的字符數(shù) 縮排方式(Indentation) 空白符/行 友情提示:通常Java的開(kāi)發(fā)環(huán)境都會(huì)提供源代碼的格式化/重排功能,如果使用記事本編輯源代碼,建議去下載一個(gè)叫astyle的源代碼重排工具(DOS命

4、令行工具)。UltraEdit有捆綁這個(gè)工具,并提供了GUI界面的調(diào)用方式。文件組織文件組織 源程序文件一般采用如下的組織順序: 最開(kāi)始一般是注釋 package 和 import 語(yǔ)句 類和接口的定義OOP-Part II 繼承性繼承性類的繼承和實(shí)現(xiàn)類的繼承和實(shí)現(xiàn) 一個(gè)類可以被繼承,繼承有什么好處呢? 當(dāng)一個(gè)類被繼承的時(shí)候,它所有說(shuō)明為protected和public的成員(變量和函數(shù))都可以傳遞到它的下一代,這就是好處。 例如圖形界面的程序,一般都需要繼承JFrame,因?yàn)镴Frame這個(gè)類幫你做了很多事情:繪制一個(gè)界面,做一個(gè)標(biāo)題欄,可以縮放要是你自己從頭開(kāi)始做一個(gè)類似功能的類,那難度可

5、就太可怕了 但是如果你繼承JFrame的話,那么JFrame可以把它擁有的超過(guò)150個(gè)精心設(shè)計(jì)功能強(qiáng)大的函數(shù)轉(zhuǎn)讓給你使用!多好的JFrame啊直接繼承直接繼承JFrameJFrame類,界面就出來(lái)了類,界面就出來(lái)了 一個(gè)類可以被繼承,例如這個(gè)MyGUI類:import javax.swing.*;public class MyGUI extends JFrame public static void main(String args) MyGUI frame = new MyGUI(); frame.setTitle(早上好!); frame.setSize(500, 400); frame.

6、setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 注意這個(gè)MyGUI類,其實(shí)除了繼承,啥都沒(méi)干,但是人家就是有界面超類和子類超類和子類 當(dāng)一個(gè)類C1是從C2繼承而來(lái)的,C1叫做子類(subclass),而C2叫做超類(superclass) 子類在OOP里還有一種叫法child class,或者擴(kuò)展類(extended class),或者派生類(derived class) 超類也叫雙親類、父類(parent class),或者基類(base class) 子類通常具有比父類更強(qiáng)的功能,因?yàn)樗坏軌?/p>

7、繼承父類的成員,還可以添加屬于自己的成員繼承性繼承性 創(chuàng)建子類格式:class SubClass extends SuperClass 這里SubClass就可以繼承所有SuperClass的public和protected的成員,當(dāng)然,如果SubClass有同名的成員,那么SuperClass的將被屏蔽。例如:class A public int a; protected int b; class B extends A int a; /此a將屏蔽父類的a void f() b+; /這里的b實(shí)際上是從A繼承來(lái)的 又一個(gè)繼承的例子又一個(gè)繼承的例子class A protected int x

8、; public void f() x-; class B extends A B() x = 100; /這里直接使用的x,其實(shí)來(lái)自父類A f(); /f函數(shù)其實(shí)也是來(lái)自A,但現(xiàn)在可以直接使用 一個(gè)忠告一個(gè)忠告 由于無(wú)參的構(gòu)造函數(shù)會(huì)被子類自動(dòng)調(diào)用,因此如果一個(gè)類將來(lái)有可能被繼承,一定要提供一個(gè)無(wú)參的構(gòu)造函數(shù)。例如下面的代碼會(huì)有編譯錯(cuò)誤: public class Apple extends Fruit class Fruit public Fruit(String name) System.out.println(Fruit的構(gòu)造函數(shù)); super & thissuper &

9、; this Java中通過(guò)super來(lái)實(shí)現(xiàn)對(duì)父類父類成員的訪問(wèn),super用來(lái)引用當(dāng)前對(duì)象的父類。super 的使用有三種情況: 1)訪問(wèn)父類被隱藏的成員變量,如:super.variable; 2)調(diào)用父類中被重寫(xiě)的方法,如:super.Method(paramlist); 3)調(diào)用父類的構(gòu)造函數(shù),如:super(paramlist); this用于調(diào)用同一個(gè)類同一個(gè)類的成員變量或者成員方法,用法和super類似,其格式為: this.variable; this.Method(paramlist);thisthis的例子的例子class Point private int x,y; pu

10、blic void setX(int xx) this.x=xx; public int getX() return this.x; public void setY(int y) this.y = y; public int getY() return this.y; 注意只有斜體部分的this才是一定要使用this的場(chǎng)合,其它情況下并不需要this。supersuper和和thisthis的例子的例子class A protected int x; public void f() x-; class B extends A int x; void f() this.x+; /這里用的是自己

11、的x,也可以直接寫(xiě)x+ super.x = 100; /這里用的是父類繼承來(lái)的x super.f(); /f函數(shù)其實(shí)也是來(lái)自父類 總結(jié)一下繼承性總結(jié)一下繼承性 public:包內(nèi)及包外的任何類均可以繼承或訪問(wèn); protected:包內(nèi)的任何類,及包外的那些繼承了此類的子類才能訪問(wèn); default:包內(nèi)的任何類都可以訪問(wèn)它,而包外的任何類都不能訪問(wèn)它(包括包外繼承了此類的子類) ; private:不能被繼承,只能在類內(nèi)部使用。 繼承性的完整例子繼承性的完整例子題目題目 我們想做一個(gè)類Circle表示平面直角坐標(biāo)系上的一個(gè)圓(解析幾何還記得吧.)。 然后我們想做一個(gè)求面積的成員函數(shù)。 我們還

12、要假定所有的Circle的成員變量都是private的,所有的成員函數(shù)都是public的,下面開(kāi)始動(dòng)手設(shè)計(jì)這個(gè)類。操作步驟操作步驟 1 1 先搭一個(gè)空架子總是沒(méi)有問(wèn)題的:class Circle操作步驟操作步驟 2 2 設(shè)計(jì)一下成員變量,這里三個(gè)足夠了:class Circle private double r; /r是半徑 private double x,y; /(x,y)是圓心坐標(biāo)操作步驟操作步驟 3 3 然后是構(gòu)造函數(shù),這里先搞兩個(gè):class Circle private double r; private double x,y; public Circle() x=0; y=0;

13、r=1; public Circle(double x, double y, double r) this.x=x; this.y=y; this.r=r; /親,不小心又用到了this,還記得this干嗎的不? 操作步驟操作步驟 4 4 然后是面積函數(shù):class Circle private double r; private double x,y; public Circle() x=0; y=0; r=1; public Circle(double x, double y, double r) this.x=x; this.y=y; this.r=r; public double ge

14、tArea() return (Math.PI*r*r); EclipseEclipse測(cè)試程序測(cè)試程序 綜合一下以上的所有步驟: 先建一個(gè)工程,名字隨意,再建一個(gè)類,名字叫Circle,然后把Circle的代碼貼上; 再建一個(gè)類,名字隨意,例如叫Test,勾上自動(dòng)生成main函數(shù)的選項(xiàng); 現(xiàn)在你的工程里應(yīng)該有兩個(gè)java源文件,兩個(gè)類,其中一個(gè)是用來(lái)測(cè)試的類,所以它有main函數(shù),Circle類由于沒(méi)有main函數(shù),所有它是不能運(yùn)行的。因此啟動(dòng)運(yùn)行的主類是Test。TestTest類的寫(xiě)法類的寫(xiě)法public class Testpublic static void main(String

15、args) Circle c1 = new Circle();System.out.println(c1.getArea();Circle c2 = new Circle(3.0,4.0,5.0);System.out.println(c2.getArea();CircleCircle的改進(jìn)的改進(jìn) Circle類顯然不完善,例如你在Test類里,如果想知道c1的x,y,r三個(gè)成員分別是多少,可能嗎?如果你想在Test類里,隨時(shí)修改c1的半徑,可能嗎? 答案顯然不行,所以,Circle其實(shí)還有很多的成員函數(shù)需要添加。 這里就不演示了,自己動(dòng)手試試。研究一下對(duì)象的引用研究一下對(duì)象的引用 一個(gè)類的成

16、員函數(shù)(static除外),是不是一定要new才能被使用呢?例如GUI編程中經(jīng)常有這種語(yǔ)句:Container container = getContentPane(); container.add(new Button(button1); 這個(gè)container好像就沒(méi)有new對(duì)吧?怎么就可以抓來(lái)用呢?難道隨便get一下也能用? 其實(shí)這個(gè)container已經(jīng)被new過(guò)了,只是你沒(méi)有看見(jiàn)而已。get一下相當(dāng)于做對(duì)象的引用。這么說(shuō)好像很復(fù)雜,看一個(gè)例子:對(duì)象的引用對(duì)象的引用 I I class A public int x; public class Testpublic static voi

17、d main(String args) A a = new A(); a.x = 1; System.out.println(a.x=+a.x); A b = a; /注意這里注意這里b不是不是new出來(lái)的出來(lái)的 b.x = 10; System.out.println(b.x=+b.x); System.out.println(a.x=+a.x); a.x = 100; System.out.println(a.x=+a.x); System.out.println(b.x=+b.x); 這個(gè)例子的輸出是:a.x=1b.x=10a.x=10a.x=100b.x=100對(duì)象的引用對(duì)象的引用 I

18、I II 總結(jié)一下,如果一個(gè)對(duì)象不是new出來(lái)的(例子中的b),而是直接用一個(gè)已經(jīng)new出來(lái)的對(duì)象(例子中的a)給它賦值,那么這個(gè)對(duì)象b就叫做a的引用。 引用的對(duì)象之所以可以直接使用,不需要new,其實(shí)是因?yàn)樗赶虻膶?duì)象和賦值給它所指向的對(duì)象和賦值給它的對(duì)象是同一個(gè)它的對(duì)象是同一個(gè)!也就是它只是給原來(lái)的對(duì)象起了一個(gè)別名而已。對(duì)象的引用對(duì)象的引用 IIIIII 總結(jié)一下,類似下面這樣總結(jié)一下,類似下面這樣b=a的操作叫做對(duì)的操作叫做對(duì)象引用:象引用: A a = new A(); A b=a; 對(duì)象的引用乍看上去有點(diǎn)類似對(duì)象整體賦值,因?yàn)樵谀承└呒?jí)語(yǔ)言中,確實(shí)會(huì)把a(bǔ)整體復(fù)制一遍給b,于是a和b

19、僅僅內(nèi)容相同而已,但是屬于不同對(duì)象;但是Java對(duì)這句話的理解卻是:b僅僅是a的別名,a和b其實(shí)表示同一個(gè)對(duì)象。所以別把語(yǔ)言搞混了。OOP-Part III 多態(tài)性多態(tài)性多態(tài)性多態(tài)性 靜態(tài)多態(tài)性 體現(xiàn)在方法的重載 在編譯階段,具體調(diào)用哪個(gè)被重載的方法,編譯器會(huì)根據(jù)參數(shù)的不同來(lái)靜態(tài)確定調(diào)用相應(yīng)的方法。 動(dòng)態(tài)多態(tài)性 由于子類繼承了父類所有的屬性(私有的除外),所以子類對(duì)象可以作為父類對(duì)象使用。程序中凡是使用父類對(duì)象的地方,都可以用子類對(duì)象來(lái)代替。一個(gè)對(duì)象可以通過(guò)引用子類的實(shí)例來(lái)調(diào)用子類的方法。 重寫(xiě)方法的調(diào)用原則(匹配原則):對(duì)子類的一個(gè)實(shí)例,如果子類重寫(xiě)了父類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;

20、否則調(diào)用父類的方法。靜態(tài)多態(tài)性:函數(shù)重載靜態(tài)多態(tài)性:函數(shù)重載class A A() A(int i) i+; void fun(int i) i+; void fun(double f) f+; void fun(int i, int j) i+; j+; 上例中函數(shù)A和fun都算重載。 重載的特征:函數(shù)名相同重載的特征:函數(shù)名相同 重載的兩個(gè)要素:重載的兩個(gè)要素: 參數(shù)類型不同參數(shù)類型不同 參數(shù)個(gè)數(shù)不同參數(shù)個(gè)數(shù)不同 重載與返回值無(wú)關(guān)重載與返回值無(wú)關(guān)動(dòng)態(tài)多態(tài)性動(dòng)態(tài)多態(tài)性當(dāng)繼承發(fā)生的時(shí)候,動(dòng)態(tài)多態(tài)性就來(lái)了當(dāng)繼承發(fā)生的時(shí)候,動(dòng)態(tài)多態(tài)性就來(lái)了有個(gè)例子有個(gè)例子class A public void f

21、un() System.out.println(“A”); class B extends A public void fun() System.out.println(“B”); class C extends B public void fun() System.out.println(“C”); class Test public static void main(String args) A a; B b = new B(); C c = new C(); a=b; a.fun(); / 此處將輸出Ba=c; a.fun(); / 此處將輸出C 解釋一下解釋一下 Java 的動(dòng)態(tài)多態(tài)性

22、這種機(jī)制遵循一個(gè)原則:當(dāng)超類(父類)對(duì)象的引用變量引用子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰(shuí)的成員方法; 當(dāng)然,這個(gè)被調(diào)用的方法必須是必須是在超類中定義過(guò)的,也就是說(shuō)被子類覆蓋的方法。你可能會(huì)問(wèn),如果這個(gè)方法沒(méi)有被覆蓋呢?Good question還有個(gè)例子還有個(gè)例子class A public void fun() System.out.println(“A”); class B extends A public void funB() System.out.println(“B”); class C extends B public void funC() Syste

23、m.out.println(“C”); class Test public static void main(String args) A a; B b = new B(); C c = new C(); a=b; a.fun(); / 此處將輸出Aa=c; a.fun(); / 此處將輸出A 總結(jié)一下總結(jié)一下 Java在函數(shù)調(diào)用的時(shí)候,是按照這個(gè)順序查找函數(shù)的:1. 先看看自己有沒(méi)有這個(gè)函數(shù),如有則調(diào)用;2. 向上一級(jí),看看有沒(méi)有這個(gè)函數(shù),一直上溯到找到函數(shù)為止。 Java的子類可以直接轉(zhuǎn)化直接轉(zhuǎn)化為父類( class B extends A ) 如:B b = new B(); A a =

24、 b; /注意這里a是引用 Java的父類必須強(qiáng)制轉(zhuǎn)化強(qiáng)制轉(zhuǎn)化為子類( class B extends A ) 如:A a = new A(); B b = (B)a; /這個(gè)操作沒(méi)意義 或:B b = new B(); A a = b; B bb = (B)a;/這個(gè)倒可以,但是繞了一圈,還不如直接用:bb = b,效果一樣抽象類與接口抽象類與接口 I I 是不是所有的類都可以new出來(lái)用?答案是:NO!因?yàn)槌橄箢惥筒豢梢浴K荒鼙焕^承。 接口是一種特殊的抽象類,它也不能被new出來(lái),而只能被實(shí)現(xiàn)(implements)。 抽象類的定義是在class前面加上一個(gè)abstract,而接口的定義

25、是把class關(guān)鍵字換成了interface。抽象類與接口抽象類與接口 II II 例如:class A /A是類 . abstract class B /B是抽象類 . interface C /C是接口,一種特殊的抽象類 . 為什么需要抽象類?為什么需要抽象類?I I 在面向?qū)ο蟮母拍钪?,所有的?duì)象都是通過(guò)類來(lái)描述的,但是反過(guò)來(lái)卻不是這樣:并不是所有的類都是用來(lái)描述對(duì)象的并不是所有的類都是用來(lái)描述對(duì)象的,如果一個(gè)類中沒(méi)有包含足夠的信息來(lái)描述一個(gè)具體的對(duì)象,這樣的類就是抽象類。 抽象類往往用來(lái)表征我們?cè)趯?duì)問(wèn)題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的

26、抽象。 為什么需要抽象類?為什么需要抽象類?II II 比如:圓、三角形、矩形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個(gè)概念,形狀這個(gè)概念在問(wèn)題領(lǐng)域是不存在的,它就是一個(gè)抽象概念。 正是因?yàn)槌橄蟮母拍钤趩?wèn)題領(lǐng)域沒(méi)有對(duì)應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能夠?qū)嵗?。為什么需要抽象類?為什么需要抽象類?IIIIII 如果我們要設(shè)計(jì)一個(gè)Shape的類,用來(lái)表示幾何形狀;內(nèi)含一個(gè)函數(shù)getArea,表示這個(gè)形狀的面積可是這個(gè)面積目前是無(wú)法求的,因?yàn)槲覀兊男畔⑻?,所以,這個(gè)Shape只能設(shè)計(jì)成抽象類。 在Shape基礎(chǔ)上,我們可以繼承出一個(gè)類Rect,用來(lái)表示矩形;也設(shè)計(jì)

27、一個(gè)類Circle,用來(lái)表示圓形;顯然,這兩個(gè)類的getArea函數(shù)體是可以實(shí)現(xiàn)的。為什么需要抽象類?為什么需要抽象類?IVIV abstract class和interface在Java語(yǔ)言中都可以用來(lái)設(shè)計(jì)抽象類。 abstarct class在Java語(yǔ)言中體現(xiàn)了一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間必須存在“is a”關(guān)系,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。 例如上一個(gè)例子,Rect和Circle都是一種形狀,因此用Shape做父類是很自然的。此時(shí)Shape設(shè)計(jì)成abstract class在概念上也比較好接受。為什么需要抽象類?為什么需要抽象類?V V interf

28、ace表示的是“l(fā)ike a”或者“has a”關(guān)系。我們用一個(gè)例子來(lái)表明,盡管都可以表示抽象類,但是abstract class并不是萬(wàn)能的。 例如我們?cè)O(shè)計(jì)一個(gè)類HaoJiao,用來(lái)描述動(dòng)物的嚎叫。顯然各種動(dòng)物嚎法不同,所以這個(gè)類沒(méi)法具體實(shí)現(xiàn),因此只能設(shè)計(jì)成抽象類??墒牵琀aoJiao好繼承嗎?難道有更高級(jí)的HaoJiao? 如果我們還有一個(gè)類Animal,顯然它應(yīng)該會(huì)有HaoJiao的屬性,但是Animal不能繼承自HaoJiao(否則在概念上實(shí)在不好理解)。于是我們只能將HaoJiao設(shè)計(jì)成interface,然后類Animal可以實(shí)現(xiàn)實(shí)現(xiàn)(implements)這個(gè)接口。抽象類與接口抽

29、象類與接口 IIIIII 抽象類有一個(gè)特殊的規(guī)定,它里面的抽象函數(shù)在繼承的類中一定要被重寫(xiě)?。槭裁茨??如果你接受不了這個(gè)事實(shí),參見(jiàn)剛翻過(guò)的5頁(yè)P(yáng)PT) 接口也有一個(gè)特殊的規(guī)定,它里面的抽象函數(shù)在實(shí)現(xiàn)的類中一定要被重寫(xiě)?。ú贿^(guò)很不幸,接口里所有的函數(shù)都是抽象的,所以它是特殊抽象類) 所以總結(jié)起來(lái)就是一點(diǎn),抽象函數(shù)在設(shè)計(jì)的時(shí)候,抽象函數(shù)在設(shè)計(jì)的時(shí)候,自己是不用寫(xiě)函數(shù)體的(其實(shí)是想寫(xiě)也寫(xiě)不了,自己是不用寫(xiě)函數(shù)體的(其實(shí)是想寫(xiě)也寫(xiě)不了,呵呵);但是一旦被繼承呵呵);但是一旦被繼承extends或者實(shí)現(xiàn)或者實(shí)現(xiàn)implements,函數(shù)體就一定要被具體實(shí)現(xiàn)。,函數(shù)體就一定要被具體實(shí)現(xiàn)。抽象類和繼承的例

30、子抽象類和繼承的例子abstract class A abstract public void f(); /注意這里沒(méi)有函數(shù)體class B extends A public void f() /注意這里已經(jīng)實(shí)現(xiàn)了f函數(shù),盡管只是空函數(shù)class C extends A double x; public void f() x=100; /注意這里已經(jīng)實(shí)現(xiàn)了f函數(shù) public void ff() x+; /這個(gè)是C自己的函數(shù)接口和實(shí)現(xiàn)的例子接口和實(shí)現(xiàn)的例子interface A abstract public void f(); /注意這里沒(méi)有函數(shù)體class B implements A p

31、ublic void f() /注意這里已經(jīng)實(shí)現(xiàn)了f函數(shù),盡管只是空函數(shù)class C implements A double x; public void f() x=100; /注意這里已經(jīng)實(shí)現(xiàn)了f函數(shù) public void ff() x+; /這個(gè)是C自己的函數(shù)接口總結(jié)接口總結(jié) 接口是一種特殊的抽象類,所以它仍然具有類的特點(diǎn)。 Java在繼承機(jī)制上,只支持單一繼承(也就是任何類的父類只有一個(gè))。假設(shè)你現(xiàn)在想同時(shí)把A類和B類的遺產(chǎn)繼承過(guò)來(lái),就只能借助于接口了。因?yàn)镴ava允許你實(shí)現(xiàn)多個(gè)接口,用逗號(hào)隔開(kāi)就可以,當(dāng)然前提是A和B你要先改成接口才行。 順便說(shuō)一句,當(dāng)你隨手寫(xiě)一個(gè)class A,而沒(méi)有繼承任何類的時(shí)候,其實(shí)這個(gè)A并不是孤零零的,因?yàn)镴ava會(huì)認(rèn)為A繼承了java.lang.Object。內(nèi)部類內(nèi)部類 I I 為什么需要內(nèi)部類? Java中的內(nèi)部類和接口加在一起,可以有效解決常被C+程序員抱怨Java中存在的一個(gè)問(wèn)題沒(méi)有多繼承。實(shí)際上,C+的多繼承設(shè)計(jì)起來(lái)很復(fù)雜,而Java通過(guò)內(nèi)部類加上接口,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論