欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java設計模式編程中的里氏替換原則

 更新時間:2016年02月03日 10:24:04   作者:lixiang0522  
這篇文章主要介紹了Java設計模式編程中的里氏替換原則,有這個名字是因為這是由麻省理工學院的一位姓里的女士Barbara Liskov提出來的(嗯...),需要的朋友可以參考下

定義1:如果對每一個類型為 T1的對象 o1,都有類型為 T2 的對象o2,使得以 T1定義的所有程序 P 在所有的對象 o1 都代換成 o2 時,程序 P 的行為沒有發(fā)生變化,那么類型 T2 是類型 T1 的子類型。
定義2:所有引用基類的地方必須能透明地使用其子類的對象。
問題由來:有一功能P1,由類A完成?,F需要將功能P1進行擴展,擴展后的功能為P,其中P由原有功能P1與新功能P2組成。新功能P由類A的子類B來完成,則子類B在完成新功能P2的同時,有可能會導致原有功能P1發(fā)生故障。
解決方案:當使用繼承時,遵循里氏替換原則。類B繼承類A時,除添加新的方法完成新增功能P2外,盡量不要重寫父類A的方法,也盡量不要重載父類A的方法。
         繼承包含這樣一層含義:父類中凡是已經實現好的方法(相對于抽象方法而言),實際上是在設定一系列的規(guī)范和契約,雖然它不強制要求所有的子類必須遵從這些契約,但是如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞。而里氏替換原則就是表達了這一層含義。
        繼承作為面向對象三大特性之一,在給程序設計帶來巨大便利的同時,也帶來了弊端。比如使用繼承會給程序帶來侵入性,程序的可移植性降低,增加了對象間的耦合性,如果一個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,并且父類修改后,所有涉及到子類的功能都有可能會產生故障。

例子:

public class Rectangle { 
  int width; 
  int height; 
  public Rectangle(int w, int h){ 
    width = w; 
    height = h; 
  } 
  public int getArea(){ 
    return width*height; 
  } 
} 
 
public class Square extends Rectangle { 
  public Square(int w, int h) { 
    super(w, h); 
  } 
   
  public int getArea(){ 
    return width*width; 
  } 
} 
 
public class Test { 
  public static void main(String[] args) { 
    Rectangle rectangle = new Rectangle(10, 20); 
        // Square rectangle = new Square(10, 20); 
    System.out.println("面積:"+rectangle.getArea()); 
  } 
} 


如果我們把長方形類Rectangle 替換為正方形類Square,那么求出的面積就不正確了,原因是我們繼承的時候重寫了父類的getArea方法。這是違背里氏替換原則的。
當然,這里只是舉個例子,實際項目中我們不會這樣修改的。

總結:
1. 盡量不要重寫父類方法,而是增加自己特有的方法。
2. 繼承給程序設計帶來巨大便利的同時,也帶來了弊端。如果一個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,并且父類修改后,所有涉及到子類的功能都有可能會產生BUG。

相關文章

  • java二路歸并排序示例分享

    java二路歸并排序示例分享

    這篇文章主要介紹了java二路歸并排序示例,需要的朋友可以參考下
    2014-02-02
  • kafka 啟動報錯 missingTopicsFatal is true的解決

    kafka 啟動報錯 missingTopicsFatal is true的解決

    這篇文章主要介紹了kafka 啟動報錯 missingTopicsFatal is true的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 剖析Fork?join并發(fā)框架工作竊取算法

    剖析Fork?join并發(fā)框架工作竊取算法

    這篇文章主要為大家剖析介紹了Fork?join并發(fā)框架工作竊取算法的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • SpringBoot中驗證用戶上傳的圖片資源的方法

    SpringBoot中驗證用戶上傳的圖片資源的方法

    這篇文章主要介紹了在SpringBoot中驗證用戶上傳的圖片資源,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • mybatis-plus QueryWrapper 添加limit方式

    mybatis-plus QueryWrapper 添加limit方式

    這篇文章主要介紹了mybatis-plus QueryWrapper 添加limit方式,具有很好的參考價值,希望對大家有所
    2022-01-01
  • java開發(fā) 線上問題排查命令詳解

    java開發(fā) 線上問題排查命令詳解

    這篇文章主要介紹了java開發(fā) 線上問題排查命令詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 徹底搞懂Java多線程(二)

    徹底搞懂Java多線程(二)

    這篇文章主要給大家介紹了關于Java面試題之多線程和高并發(fā)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2021-07-07
  • 淺析SpringBoot統(tǒng)一返回結果的實現

    淺析SpringBoot統(tǒng)一返回結果的實現

    前后端開發(fā)過程中數據交互規(guī)范化是一件非常重要的事情,不僅可以減少前后端交互過程中出現的問題,也讓代碼邏輯更加具有條理,下面小編就和大家講講SpringBoot如何統(tǒng)一返回結果的吧
    2023-07-07
  • SSM框架前后端信息交互實現流程詳解

    SSM框架前后端信息交互實現流程詳解

    這篇文章主要介紹了SSM框架前后端信息交互實現流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringMVC解析post請求參數詳解

    SpringMVC解析post請求參數詳解

    今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08

最新評論