1. 程式人生 > >08. Java基礎之復用類

08. Java基礎之復用類

.get details 等等 display car com detail 系統結構 支持

其實實現的兩種方法就是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         int
j = 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
View Code

這裏有個包訪問權限的問題,假如沒有加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基礎之復用類