Java進階(九)介面實現Java多重繼承的夢
多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為和特徵,然而我們知道Java為了保證資料安全,它只允許單繼承。有些時候我們會認為如果系統中需要使用多重繼承往往都是糟糕的設計,這個時候我們往往需要思考的不是怎麼使用多重繼承,而是您的設計是否存在問題.但有時候我們確實是需要實現多重繼承,而且現實生活中也真正地存在這樣的情況,比如遺傳:我們即繼承了父親的行為和特徵也繼承了母親的行為和特徵。慶幸的是Java是非常友善和理解我們的,它提供了兩種方式讓我們曲折來實現多重繼承:介面和內部類。
從而可以實現Java多重繼承的夢——介面
實現多個介面,這就為我們實現多重繼承做了鋪墊。對於介面而已,有時候它所表現的不僅僅只是一個更純粹的抽
象類,介面是沒有任何具體實現的,也就是說,沒有任何與介面相關的儲存,因此也就無法阻止多個介面的組合了
請看下面casee:
從而可以實現Java多重繼承的夢——內部類interface CanFight { void fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } public class ActionCharacter { public void fight(){ } } public class Hero extends ActionCharacter implements CanFight,CanFly,CanSwim{ public void fly() { } public void swim() { } //對於fight()方法,繼承父類的,所以不需要顯示宣告 }
使用介面實現多重繼承是一種比較可行和普遍的方式,在介紹內部類的時候談到內部類使的多繼承的實現變得
更加完美了,同時也明確瞭如果父類為抽象類或者具體類,那麼我就僅能通過內部類來實現多重繼承了。如何利用內
部類實現多重繼承,請看下面例項:後代是如何利用多重繼承來繼承Father和Mother的優良基因。
首先是Father類和Mother類:
public class Father { public int strong(){ return 9; } } public class Mother { public int kind(){ return 8; } }
重頭戲在這裡,Son類:
public class Son {
/**
* 內部類繼承Father類
*/
class Father_1 extends Father{
public int strong(){
return super.strong() + 1;
}
}
class Mother_1 extends Mother{
public int kind(){
return super.kind() - 2;
}
}
public int getStrong(){
return new Father_1().strong();
}
public int getKind(){
return new Mother_1().kind();
}
}
測試程式:public class Test1 {
public static void main(String[] args) {
Son son = new Son();
System.out.println("Son 的Strong:" + son.getStrong());
System.out.println("Son 的kind:" + son.getKind());
}
}
----------------------------------------
Output:
Son 的Strong:10
Son 的kind:6
兒子繼承了父親,變得比父親更加強壯,同時也繼承了母親,只不過溫柔指數下降了。這裡定義了兩個內部類,他們
分別繼承父親Father類、母親類Mother類,且都可以非常自然地獲取各自父類的行為,這是內部類一個重要的
特性:內部類可以繼承一個與外部類無關的類,保證了內部類的獨立性,正是基於這一點,多重繼承才會成為可能。
有關於更多介面和內部類的詳情,請參考這裡:
相關推薦
Java進階(九)介面實現Java多重繼承的夢
多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為和特徵,然而我們知道Java為了保證資料安全,它只允許單繼承。有些時候我們會認為如果系統中需要使用多重繼承往往都是糟糕的設計,這個時候我們往往需要思考的不是怎麼使用多重繼承,而是您的設計是否存在問題.但有時候我們確實是
JAVA進階(九)時間處理類
前言 前面學些了可變字元序列StringBuilder以及StringBuffer類,本章將繼續學習常用類事件處理類 範例 1.時間的概念 在java中,我們用long型別資料表示每一個時刻的時間,單位為毫秒,以1970年1月1日 00:00:00為基點進
CSS進階(九) position:absolute
剪裁 ble 展現 splay ng- 祖先 isp 使用 之間 特性 (1)塊狀化,display渲染為block或table (2)文檔流破壞性 (3)包裹性 (4)塊狀格式化上下文,也就是BFC,absolute 的自適應性最大寬度往往不是由父元素決定的 absolu
JAVA進階(06)多執行緒
一、三個概念 1、程式 程式(Program)是一個靜態的概念,一般對應於作業系統中的一個可執行檔案 2、程序 (1)執行中的程式叫做程序(Process),是一個動態的概念 (2)特點: 程序是程式的一次動態執行過程, 佔用特定的地址空間 每個程序由3
JAVA進階(05)IO技術
一、入門 1、資料來源 (1)資料來源分為: 源裝置:為程式提供資料,一般對應 輸入流 目標裝置:程式資料的目的地,一般對應 輸出流 2、資料流 3、典型的IO流程式碼 public static void main(String[] args) {
JAVA進階(03)常用類
一、包裝類 1、包裝類概述 8種基本型別對應8種包裝類,除了 Integer 和 Character 類以外,其他只是類名首字母大寫; 除了 Character 和 Boolean,其他都是數字型,繼承自 Number 類,重寫過 intValue()、lon
JAVA進階(02)陣列
一、概述 1、定義 陣列是相同型別資料的有序集合; 2、特點 長度是確定的; 元素必須是相同型別,可以是基本型別和引用型別; 3、本質 陣列是物件,每個元素可以看作是物件的屬性; 陣列無論存基本型別還是引用型別,陣列物件本身是在堆中儲存的
JAVA進階(01)異常處理
一、概述(Exception) 二、異常分類 1、繼承結構 說明: ClassNotFoundException 不屬於執行時異常 2、error (1)Error與Exception的區別
SpringCloud從入門到進階(九)——單點部署Zuul的壓力測試與調優(二)
內容 作為微服務架構系統的入口,毫無疑問,Zuul的併發效能直接決定了整個系統的併發效能。本文結合前幾篇文章的內容,在雲伺服器中部署了包含Eureka Server,Zuul等元件的1.0版本的微服務架構,並進行單點部署Zuul的壓力測試,對其併發效能一探究竟。 環境 說明 轉載請說明出處
Activiti進階(九)——接收任務(ReceiveTask)
接收任務(ReceiveTask)即等待任務,接收任務是一個簡單任務,它會等待對應訊息的到達。當前,官方只實現 了這個任務的java語義。 當流程達到接收任務,流程狀態會儲存到資料庫中。在任務建立後,意味著流程會進入等 待狀態,直到引擎接收了一個特定的訊息, 這會觸發流程穿過接收任務繼續執行
Vue進階(九):webstorm啟動vue專案配置
使用命令視窗執行 1. npm run mock 2.npm run dev 每次都開啟命令視窗比較麻煩,可以在webstorm內進行配置,從webstorm內啟動 選中run下面的edit configurations,scripts裡面分別選擇mock和
Java進階(五)Java I/O模型從BIO到NIO和Reactor模式
本文介紹了Java中的四種I/O模型,同步阻塞,同步非阻塞,多路複用,非同步阻塞。同時將NIO和BIO進行了對比,並詳細分析了基於NIO的Reactor模式,包括經典單執行緒模型以及多執行緒模式和多Reactor模式。 原創文章,轉載請務必將下面這段話置於文章開頭處(保留超連結)。 本文
JAVA進階(七)
前言 接下來我們進入到String類的學習,這個類可以說是學習java的時候至關重要的基礎類 範例 1.String類的概念 String類又稱作不可變字元序列 String位於j
JAVA進階(十)File類與列舉
前言 本章講解File類的基本用法,為後面講解IO流做一個鋪墊性的準備工作 範例 1.File類的基本概念 java.io.File類:代表檔案和目錄。在開發中,讀取檔案、生成檔案、刪除檔案、修改檔案屬性的時候將會用到本類,可以說很重要 2.構造方法(一
java進階(一):泛型
1、泛型簡介 所謂泛型,即通過引數化型別來實現在同一份程式碼上操作多種資料型別,泛型程式設計是一種程式設計正規化,他利用“引數化型別”將型別抽象化,從而實現更為靈活的複用。 先簡單給個例子: //可以想象這裡的T為Integer型別,以便於理解,其實它可以是任何型別 p
JAVA進階(04)容器
一 泛型 泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 1、泛型方法 (1)泛型方法的定義規則 <E> 在方法返回值之前。 多個型別引數(<E>)間用逗號隔開。 返回值型別可以用泛型宣告,方法內,泛型可以當作正常的類來使
Java進階(一)JDBC
用Java來寫的應用程式,無論是 B/S 架構還是 C/S架構,要想程式很好的完成需要的功能,最主要的還是資料。這就要提到資料庫。事實上,資料庫可以獨立的應用,但是程式要想利用資料庫並進行相關的增刪改查(CRUD)操作,就需要將Java程式與資料庫相連線。這時,就要用到JD
java進階(三):反射(3)——陣列的反射與集合的運用(ArrayList、HashSet)
一、陣列的反射 1、簡單的陣列反射: 1)同樣型別切且具有相同維度的陣列擁有同一份位元組碼 /* * 5- 陣列的的反射 */ int[] a1 = new int[3]; int[] a2 = new int[4]; int[][] a3 =
前端基礎進階(九):圖例詳解那道setTimeout與迴圈閉包的經典面試題
配圖與本文無關 我在詳細圖解作用域鏈與閉包一文中的結尾留下了一個關於setTimeout與迴圈閉包的思考題。 利用閉包,修改下面的程式碼,讓迴圈輸出的結果依次為1, 2, 3, 4, 5 for (var i=1; i<=5; i++) { setTimeout( function ti
java程式設計師菜鳥進階(十三)linux基礎入門(一)vmvare下安裝linux RedHat圖解(超詳細篇)
對於linux,我從大二就想學習一下,但一直苦於無從下手,所以一直拖到現在,鑑於筆者瞭解很多人在linux入門的困難在何處,所以我認為本套入門基礎文章還是挺適合想學習linux的朋友,本系列文章大約十篇文章左右,近期會不斷更新下來,沒有linux基礎但又想學習linux的朋友可以關注一下本系列