08. Java基礎之復用類
其實實現的兩種方法就是java中經常聽到的——組合和繼承。
(1)組合
has-a的作用。
1 public class TV { 2 Show show; 3 public String toString(){ 4 return "showgirl"; 5 } 6 } 7 8 class Show{ 9 }View Code
提一下toString方法,當你需要String而你是一個對象的時候,編譯器會調用對象的toString方法。
TV裏有Show,現在的show沒有初始化,為null,不能調用show的方法。
組合的作用強大,以面向對象看,假如你在造一個Car類,那麽你可以用組合輕易的將Glass,Light,Engine等等的Car這些部件組合起來。
(2)繼承
is-a
1 package com.myown.iaiti; 2 3 public class Father { 4 public int i; 5 void get(){ 6 System.out.println("father"); 7 } 8 } 9 10 package son; 11 import com.myown.iaiti.*; 12 13 public class Son extends Father{ 14 Father f = new Father(); 15 intView Codej = f.i; 16 Son son = new Son(); 17 son.get(); 18 } 19 20 public void get(){ 21 super.get(); 22 System.out.println("son"); 23 } 24 } 25
這裏有個包訪問權限的問題,假如沒有加public的時候,默認是包內成員訪問,不同包訪問,即Son中的Father成員訪問get方法是不可見的。而public的話是可見的,所以i訪問得到。
private部分是不能繼承,屬於父類私有,而public的部分,將繼承,需要修改的方法,可以進行重寫。要添加的屬性可以單獨添加。
而且繼承的方法,如果原本的father的public方法重寫之後沒將public加上,會有Cannot reduce the visibility of the inherited method from Father,也就是不能減少父類中繼承方法的可見性。super指的是父類,即Father。
還有一點是,其實java中所有的類都隱式地繼承了Object類。Object是父類,其他類是子類
老外喜歡講為基類。子類也叫導出類或者派生類。
(3)代理
設計模式裏面有個比較難懂的——代理模式,作者講的很有趣,代理是組合和繼承的中庸之道。
1 package son; 2 class Father{ 3 public void get(){ 4 System.out.println("father"); 5 } 6 } 7 public class Son extends Father{ 8 public static void main(String[] args) { 9 Father f = new Father(); 10 f.get(); 11 } 12 } 13 14 class FatherProxy{ 15 private Father f = new Father(); 16 public void get(){ 17 f.get(); 18 } 19 }View Code
像直接把Father當做成員,那麽father的方法就暴露給這個類了,那我們可以使用FatherProxy這樣的代理類,我自己定義好get方法是怎麽拿的,我自己知道是調用father的get方法,但是使用我這個代理的人不知道,我只告訴他你要用就用代理的get的方法就可以了。封裝性就體現出來了。上面只是隨便敲的一個簡單例子。
(4)對比
組 合 關 系 | 繼 承 關 系 |
---|---|
優點:不破壞封裝,整體類與局部類之間松耦合,彼此相對獨立 | 缺點:破壞封裝,子類與父類之間緊密耦合,子類依賴於父類的實現,子類缺乏獨立性 |
優點:具有較好的可擴展性 | 缺點:支持擴展,但是往往以增加系統結構的復雜度為代價 |
優點:支持動態組合。在運行時,整體對象可以選擇不同類型的局部對象 | 缺點:不支持動態繼承。在運行時,子類無法選擇不同的父類 |
優點:整體類可以對局部類進行包裝,封裝局部類的接口,提供新的接口 | 缺點:子類不能改變父類的接口 |
缺點:整體類不能自動獲得和局部類同樣的接口 | 優點:子類能自動繼承父類的接口 |
缺點:創建整體類的對象時,需要創建所有局部類的對象 | 優點:創建子類的對象時,無須創建父類的對象 |
參考文獻:
https://blog.csdn.net/iaiti/article/details/38438403
https://blog.csdn.net/dc765940174/article/details/53883966
08. Java基礎之復用類