1. 程式人生 > >Java學習筆記(二)--組合與繼承

Java學習筆記(二)--組合與繼承

       繼承是面向物件的三大特徵之一,也是實現軟體複用的重要手段,Java的繼承具有單繼承的特點,每個類只有一個直接父類,可以有多個間接父類。繼承是一種"is-a"的關係。

繼承

    有開發經驗的人都知道繼承該怎麼寫,我就不再重複造輪子了!

    優點:

  • 程式碼複用
  • 子類可重寫父類的方法
  • 建立子類物件時,無需建立父類的物件,子類自動擁有父類的成員變數和行為。
  • 子類在父類的基礎上可根據自己的業務需求擴充套件

   缺點:

  •  破壞封裝

為什麼破壞了封裝呢?仔細思考後,想起上篇部落格中提到的封裝,封裝是指將物件的狀態資訊隱藏在物件內部,不允許外部程式直接訪問物件內部的資訊,而是通過該類所提供的方法來實現對內部資訊的操作和訪問。如下例子中父類Fruit中有成員變數weight。Apple繼承了Fruit之後,Apple可直接操作Fruit類的成員變數,因此破壞了封裝性!

/**
 * Created by huan on 2018/3/5.
 * 繼承--父類
 */
public class Fruit {
    //成員變數
    public double weight;
    public void info(){
        System.out.println("我是一個水果!重" + weight + "g!");
    }
}
/**
 * Created by huan on 2018/3/5.
 * 繼承--子類
 */
public class Apple extends Fruit {
    public static void main(String[] args){
        Apple a = new Apple();
        a.weight = 10;
        a.info();
    }
}
  • 支援擴充套件,但往往以增加複雜度為代價
  • 不支援動態繼承,在執行時,子類無法選擇不同的父類
  • 緊耦合
當子類繼承了父類,需要修改父類介面名稱時,出現一旦修改了介面名稱,子類都會報錯,如果是同一個人維護,可能還可以修改,如果由多個人修改,後果不敢想象呀!

組合

    什麼是組合?學過設計模式的都知道,組合是一種較弱的關係,是has-a的關係。組合在程式碼中如何體現呢?如下:

/**
 * Created by huan on 2018/3/5.
 * 組合
 */
public class Animal {
    private void beat(){
        System.out.println("心臟跳動...");
    }
    public void breath(){
        beat();
        System.out.println("呼吸中...");
    }
/**
 * Created by huan on 2018/3/5.
 * 組合
 */
public class Bird {
    //將Animal作為Bird的成員變數
    private Animal a;
    public Bird(Animal a){
        this.a = a;
    }
    public void breath(){
        a.breath();
    }
    public void fly(){
        System.out.println("我在飛..");
    }

    public static void main(String[] args){
        Animal animal = new Animal();
        Bird b = new Bird(animal);
        b.breath();
        b.fly();
    }
}

  優點

  • 不破壞封裝,鬆耦合
  • 具有可擴充套件性
  • 支援動態組合

  缺點

  • 整體類不能自動獲得和區域性類同樣的介面

組合對比繼承

  • 繼承結構,子類可以獲得父類內部實現細節,破壞封裝。組合結構:整體不能看到部分的內部實現細節,不會破壞封裝
  • 繼承模式是單繼承,不支援動態繼承,組合模式可以支援動態組合
  • 繼承結構中,子類可以回溯父類,直到Object類,這樣就可以根據業務實現多型(向上轉型和向下轉型)  ,組合中不可以實現多型
  • 在開發 過程中,如果複用的部分不會改變,為了安全性和封裝的本質,應該使用組合,當我們不僅需要複用,而且還可能要重寫或擴充套件,則應該使用繼承

如何選擇?

  • 兩個類之間,明顯的存在整體和部分的關係,則應該使用組合來實現複用,當我們需要對已有類做一番改造,從而得到新的符合需求的類,則應該使用繼承
  • 當需要被複用的類一定不會改變時,應該使用組合,否則,應該使用繼承
相關文章推薦:http://blog.csdn.net/qq_31655965/article/details/54645220

相關推薦

Java學習筆記()--組合繼承

       繼承是面向物件的三大特徵之一,也是實現軟體複用的重要手段,Java的繼承具有單繼承的特點,每個類只有一個直接父類,可以有多個間接父類。繼承是一種"is-a"的關係。繼承    有開發經驗的人都知道繼承該怎麼寫,我就不再重複造輪子了!    優點:程式碼複用子類可

Java學習筆記十一:Java面向對象的三大特性之繼承

類構造 接下來 多重 通過 prot 圖片 等級 ++ class Java面向對象的三大特性之繼承 一:繼承的概念;   繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。   繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父

Java學習筆記(trim()substring())

tro 字符串 n) substr java bsp log 執行 spa 了解到這兩個函數是因為在做OJ的題目時遇到了這樣的情況: 標註輸入為:4 abc 兩種數據用空格分隔開,但找不到只讀一個字符的方法(吃掉中間的空格) trim(): 去掉字符串首尾的空格 St

Java學習筆記---環境變量

使用 nbsp tools.jar tool too 安裝目錄 指定命令 學習 java學習 1.環境變量包括: JAVA_HOME,CLASSPATH,PATH 2.設置環境變量的目的: 路徑搜索,方便查找到Java的安裝路徑、方便搜索用到的類、方便命令執

Java學習筆記:Java的方法重寫

nim 技術分享 例子 system family AC tro pack 不能 Java的方法重寫 一:什麽是方法的重寫;   如果子類對繼承父類的方法不滿意,是可以重寫父類繼承的方法的,當調用方法時會優先調用子類的方法。 語法規則   返回值類型、方法名、參

Java學習筆記十四:Java中的Object類

div equals int 父類 false info nim TE 操作 Java中的Object類 一:什麽是Object類;   Object類是所有類的父類,相當於所有類的老祖宗,如果一個類沒有使用extends關鍵字明確標識繼承另外一個類,那麽這個類

java學習筆記:方法陣列

方法: 方法的定義與使用: java中方法就是函式,將實現某些功能的程式碼封裝到方法中。 /* 概念:就是完成某個功能的程式碼,函式就是方法 格式: 修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2....){ 方法體語句: return 返回值:

java學習筆記(三)繼承(一)

繼承:繼承是類與類的一種關係 是is-a關係 能夠實現程式碼的複用 繼承的實現:class XXX extends XXX java中的繼承為單繼承     1.好處:         子類擁有父類所有的屬性

Java 學習筆記 維數組和對象數組

int tro 返回 是個 列數 一個 二維數組 [] 學習 定義二維數組 int[][] a = new int[4][5]; 可以不指定列數 int[][] a = new int[4][]; 獲取行 int i = a.length(); 如果使用第一個例子,這裏就

Java 學習筆記 維陣列和物件陣列

定義二維陣列 int[][] a = new int[4][5]; 可以不指定列數 int[][] a = new int[4][]; 獲取行 int i = a.length(); 如果使用第一個例子,這裡就是返回4 獲取列 int i = a[0].length();使用第一個例子,這裡就是

VUE學習筆記() -computedmethods的區別

最近在學習VUE的時候,發現computed與methods的作用很像,而且一些網站上也說這兩種可以互相替換使用,但實際上在用的時候,發現其實這兩者之間還是有區別的。 computed 計算屬性     可用於定義屬性的setter和getter方法,一般如果不特意強

java學習筆記

接著上次的Java語言基礎繼續: 一、常量 定義:常量就是在執行過程中其值不發生改變的量; 常量的分類:字面值常量和自定義常量; 字面值常量包括: 字串常量,整數常量,小數常量,字元常量,布林型常 量,空常量; 其中整數常量提供了四種表現形式:二進位制,八進位

Java學習筆記--Collection集合Map的實現類介紹

陣列和集合的區別: 長度區別:陣列長度固定,而集合長度可變。 內容不同:陣列儲存同一種資料型別,而集合可以儲存不同型別的元素。 元素的資料型別問題:陣列可以儲存基本資料型別,也可以儲存引用資料型別;而集合只能儲存引用型別。 LinkedList與ArrayList相比因為其是連結串列實現,具有一些特殊

Java學習筆記之——變數資料型別

一、變數 1.變數:變化的值 變數在程式碼執行期間,開闢了一塊空間 。這塊空間是有地址的,給這塊取了個名字, 這個名字就叫做變數名,這塊空間放的東西叫做變數值   2.變數的初始化: (1)先宣告再賦值: ***宣告變數:資料型別 變數名*** 宣告:int i; 賦值:i=1;

Java學習筆記--設計原則設計模式、類載入、反射的介紹

設計原則、設計模式 面向物件思想設計原則 單一職責原則:每個類應該只有一個職責,對外只能提供一種功能。其實就是”高內聚,低耦合”。 開閉原則:對擴充套件開放,對修改關閉。即在設計一個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。 里氏替換原則

Java學習筆記() Java多執行緒 synchronized同步方法-防止髒讀

1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName =

Java學習筆記21:””null的區別、常量池的理解

””與null的區別 “”是字串常量,同時也是一個String類的物件,作為物件可以呼叫String類裡的方法。 null 是空常量,不能呼叫任何的方法,否則會出現空指標異常,null常量可以給任意的引用數量型別賦值。 String str1 = null; str引用為空 St

Java學習筆記19:==equals用法比較

String s1="abc"; String s2="abc"; System.out.println(s1==s2);//true System.out.println(s1.eqauls(s2));//true //建立了幾個物件? String s1=new Strin

Java學習筆記-叉樹的遍歷

分別採用迭代和棧的方式對二叉樹進行遍歷。 import java.util.LinkedList; public class MyTree { enum Order{ PREORDER, INORDER, POSTORDER; }

[JAVA學習筆記-68]NIOAIO的區別

    non-blocking IO vs async IO and implementation in JavaYou understand the terms correctly. As noted, "non-blocking async IO" would be