1. 程式人生 > >Java 中的多重繼承

Java 中的多重繼承

介面不僅僅只是一種形式更純粹的抽象類,它的目標比這要高。因為介面是根本沒有任何具
體實現的——也就是說,沒有任何與介面相關的儲存——因此,也就無法阻止多個介面的組
合。這一點是很有價值的,因為你有時需要去表示“一個 x 是一個 a、一個 b 以及一個 c”。
在C++中,組合多個類的介面的行為被稱作“多重繼承(multiple inheritance)”。它可能會
使你揹負很棘手的包袱,因為每個類都有一個具體實現。在 Java 中,你可以執行相同的行
為,但是隻有一個類可以有具體實現,因此,通過組合多個介面,在 C++中看到的問題是不
會在 Java 中發生的:

在一個匯出類中,強制要求你必須有一個基類,它要麼是抽象的,要麼是“具體的”(沒有
任何抽象方法的類)。如果你要從一個非介面的類繼承,那麼你只能從一個這樣的類中去繼
承。其餘的基元素都必須是介面。你需要將所有的介面名都置於 implements 關鍵字之後,
用逗號將它們一一隔開。你可以繼承任意多個介面,每一個都會成為一個你可以向上轉型的
獨立型別。下面的例子展示的是:一個具體類組合數個介面之後產生了一個新類:


//: c08:Adventure.java
// Multiple interfaces.


interface CanFight { 
void fight();
}


interface CanSwim { 
void swim(); 
}


interface CanFly { 
void fly();
}


class ActionCharacter { 
 
}
 
publicvoid fight() {}
 
class Heroextends ActionCharacter 
implements CanFight, CanSwim, CanFly { 
publicvoid swim() {}
publicvoid fly() {} 
}


publicclass Adventure { 
publicstatic void t(CanFight x) { x.fight(); } 
publicstatic void u(CanSwim x) { x.swim(); } 
publicstatic void v(CanFly x) { x.fly(); } 
publicstatic void w(ActionCharacter x) { x.fight(); } 
publicstatic void main(String[] args) { 
    Hero h =new Hero(); 
    t(h);// Treat it as a CanFight
    u(h);// Treat it as a CanSwim
    v(h);// Treat it as a CanFly
    w(h);// Treat it as an ActionCharacter
  }
}///:~


你可以看到,Hero 組合了具體類 ActionCharacter 和介面 CanFight、CanSwim 和 CanFly。
當你要通過這種方式將一個具體類和多個介面組合到一起時,這個具體類必須是先行,後面
跟著的才是介面。(否則編譯器會報錯。)


注意,CanFight 介面與 ActionCharacter 類中的 fight()方法的簽名是一樣的,而且,在 Hero
中並沒有提供 fight()的定義。介面的規則是:你可以從介面中繼承(就像稍後你會看到的那
樣),但是你得到的只是另一個介面。如果你想建立該新型別的物件,就必須有一個提供了
其全部定義的類。即使 Hero 沒有顯式地提供 fight()的定義,其定義也隨 ActionCharacter
而存在,因此它是被自動提供的,這使得建立 Hero 物件成為了可能。


在 Adventure 類中,你可以看到有四個方法把上述各種介面和具體類作為引數。當 Hero 對
象被建立時,它可以被傳遞給這些方法中的任何一個,這意味著它依次被向上轉型為每一個
介面。由於 Java 中這種介面設計的方式,使得這項工作並不需要程式設計師一方付出任何特別
的努力。


一定要記住,前面的例子所展示的就是使用介面的核心原因:為了能夠向上轉型為不止一個
的基型別。然而,使用介面的第二個原因卻是與使用抽象基類相同:防止客戶端程式設計師建立
該類的物件,並確保這僅僅是建立一個介面。這就帶來了一個問題:我們應該使用介面還是
抽象類?介面為你帶來了使用抽象類的好處,並且還帶來了使用介面的好處,所以如果你要
建立不帶任何方法定義和成員變數的基類,那麼你應該選擇介面而不是抽象類。事實上,如
果你知道某事物應該成為一個基類,那麼你的第一選擇應該是使它成為一個介面,只有在強
制你必須要具有方法定義和成員變數的時候,你才應該改而選擇抽象類,或者在必要時使其

成為一個具體類。


相關推薦

java繼承

cte 它的 font java類 eight bsp 進行 per idt 1、繼承 繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。 Java類具有四種訪問控制符:priva

Java繼承、封裝、多態的理解

為什麽 apple 有一個 實現 系統 應該 要求 相等 訪問控制 Java中的繼承、封裝、多態 繼承的理解: 1、繼承是面向對象的三大特征之一,也是實現代碼復用的重要手段。Java的繼承具有單繼承的特點,每個子類只有一個直接父類。 2、Java的繼承通過extends關鍵

Java 繼承的簡單例子(super關鍵字)

class Cleanser{ private String s="Cleanser"; public void append(String a){s+=a;} public void dilute(){append("dilute()");} public void apply(){app

Java繼承和多型

複習《Java程式設計教程》這本書,發現以前對於繼承的認識有錯誤。 繼承 繼承的處理過程發生在編譯之前,所以相當於將父類的宣告內容加入到了子類的宣告中,然後根據訪問控制模式進行訪問。之前理解的public,protect成員域能在子類中訪問,private不能

Java實現多重繼承

      多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為和特徵,然而我們知道Java為了保證資料安全,它只允許單繼承。Java提供了兩種方式讓我們曲折來實現多重繼承:介面和內部類。 ①介面和內部類的應用場景區別?? 一、介面   &nbs

Java繼承、方法覆蓋(方法重寫)、super關鍵字

Java繼承 繼承 繼承是面向物件的一個重要的特性,它體現了類與類之間的一些邏輯關係,目的是為了程式碼複用(以減少開發成本)。當多個類之間有一些共同的屬性(成員變數)和功能(成員方法)時,我們可以將他們共同的部分拿出來作為一個父類定義實現這些共性,這些類中可以不再定義這

java關於繼承、多型和封裝的個人理解

super:子類中呼叫父類的普通方法或成員變數   構造方法的第一句總是:super(...)來呼叫父類相應的構造方法。流程是:先向上追溯到Object,然後再依次向下執行類的初始化塊和構造方法,直到當前子類為止。(注:靜態初始化塊呼叫順序,與構造方法呼叫順序一樣) java的三

python3多重繼承的問題

本來以為多重繼承很簡單,但是多看了一些資料後發現還是挺複雜的。 如果繼承情況簡單就還比較好理解,但是如果繼承的情況太過於複雜的話,python3 中會使用拓撲排序的方式來尋找繼承的父類。 有關繼承的拓撲排序 關於這方面看上面的文章就可以了。 我下

原來Java繼承和C#繼承是不一樣的

因為之前在學校裡學的是Java,C#是自學的,一直感覺Java和C#就像是孿生兄弟,不過今天才發現原來Java中的繼承和C#中的繼承還是有點不一樣的 在Java中子類繼承父類的方法,如果在子類重新定義了父類方法的實現,那麼這個過程就是重寫,且只能是重寫,而在C

java繼承問題

java遵循的是單繼承,c++可以多繼承,但是使其結構體變得十分複雜,所以java實行單繼承,但是也引入了介面這個概念。 單繼承針對的是class,而非interface,一個類只能extends一個,但是可以implents多個介面。 java中的介面可以多繼承,嚴格說叫

java繼承-子類繼承父類的許可權問題

                                                java中的繼承         Java語言面向物件有三大特性:封裝、繼承、多型。其中的繼承,描述了一

Java實現多重繼承技巧

多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為和特徵,然而我們知道Java為了保證資料安全,它只允許單繼承。有些時候我們會認為如果系統中需要使用多重繼承往往都是糟糕的設計,這個時候我們往往需要思考的不是怎麼使用多重繼承,而是您的設計是否存在問題.但有時候我們確實

Java介面-多重繼承-Java程式設計思想

概述 最近把Java基礎知識梳理了一下,發現了一些以前理解有偏差的地方,記錄在此。 疑問 一個類同時繼承基類和多個介面時,該類中是否可以不實現介面中的方法? 一個類同時實現多個介面,能否向上轉型到各介面? 一個類同時實現多個介面,介面中的方法簽名是否可以

java 實現多重繼承

package com.yangll; //多重繼承類 public class ClassTestylll extends Person1 { class inner extends Machine1{ @Override void run() { // T

java模擬多重繼承,且避免重複程式碼的方法

眾所周知,java是一門不支援多重繼承的語言,每當在java中談及多重繼承,人們都會說起介面。 然而一般理解之下,既然是介面,裡面的方法是不能有具體實現的,頂多也就起到一個規範的作用嘛,這樣豈不是還會造成程式碼的大量重複? 但是事實上並非如此,利用類的組合關

第八章:Java繼承以及方法的重寫

繼承 繼承是類與類的一種關係,是一種“is a”的關係 比如: 動物就是父類、基類 狗狗就是子類、派生類 注意:Java中是單繼承的,一個類只能有一個父類,跟我們人一樣,一個人只能有一個親爹。 繼承的好處 比如生活中,我們有一個很有錢的父親,我們就能少奮鬥幾年,也就意

Lua多重繼承的簡單實現

--多個table表中尋找對應key的值 function search(classes, key)     for i = 1, #classes do         local value = classes[i

【奔跑的菜鳥】Java繼承關係

對於面向物件的程式設計,最總要的三個特徵就是繼承、封裝、多型。我們現在來看看繼承是如何一步一步實現的。看下面程式碼:public class Test { public static void main(String[] args) { FuncationOfThi

聊聊java繼承(附面試題)

首先了解下為什麼要有繼承 舉個例子,我們要定義幾個類,學生類,老師類,清潔工類,在他們裡面都要定義一個吃飯的方法,那麼,每個類裡面都定義是不是有些麻煩,於是出現了繼承,想想,學生老師清潔工都是人,這個時候我們可以定義一個人類,裡面定義一個吃飯的方法,然後這幾個類再繼承人類,

java繼承與呼叫繼承的方法

package test; class People{int age,leg = 2,hand = 2;protected void showPeopleMess() {System.out.printf("%d歲,%d只腳,%d隻手\t",age,leg,hand);}} class Student ext