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

Java必須學會的類的繼承與多態(tài)

 更新時間:2020年08月18日 14:08:32   作者:弗蘭克的貓  
這篇文章主要介紹了Java類的繼承與多態(tài)的相關(guān)資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下

  繼承是類的一個很重要的特性,什么?你連繼承都不知道?你是想氣死爸爸好繼承爸爸的遺產(chǎn)嗎?(滑稽)

  開個玩笑,這里的繼承跟我們現(xiàn)實生活的中繼承還是有很大區(qū)別的,一個類可以繼承另一個類,繼承的內(nèi)容包括屬性跟方法,被繼承的類被稱為父類或者基類,繼承的類稱為子類或者導出類,在子類中可以調(diào)用父類的方法和變量。在java中,只允許單繼承,也就是說 一個類最多只能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。這就相當于一個人不能有多個父親一樣(滑稽,老王表示不服)。

  話不多說,先看栗子:

public class Employee {
  private String name;//姓名
  private double salary;//薪水
  //構(gòu)造函數(shù)
  public Employee(String name,int age,double salary){
    this.name = name;
    this.age = age;
    this.salary = salary;
  }
  
  public String getName() {
    return name;
  }

  public double getSalary() {
    return salary;
  }

  public int getAge() {
    return age;
  }
}

  我們定義了一個Employee類(雇員類),并定義了一些簡單的成員變量以及方法,接下來定義一個Manager類(經(jīng)理類)來繼承這個類。

public class Manager extends Employee{
  private double bonus;//獎金  //構(gòu)造器
  public Manager(String name, double salary){
    super(name,salary);
    bonus = 0;
  }
  //設(shè)置獎金
  public void setBonus(double bonus) {
    this.bonus = bonus;
  }
  //重載父類的getSalary方法
  @Override
  public double getSalary() {
    double baseSalary = super.getSalary();
    return baseSalary + bonus;
  }
}

  這里需要說明的是super跟this的使用,super是父類引用,可以用它來調(diào)用父類的方法和屬性,可以把它看作是父類跟子類溝通的橋梁,而this則是自身引用,可以通過它來調(diào)用自身的屬性和方法,在構(gòu)造器中我們使用了 super(name,salary); 這樣會調(diào)用父類的構(gòu)造函數(shù),

  為什么Manager可以繼承Employee這個類呢?是因為它們之間存在is-a的關(guān)系,經(jīng)理也是一個雇員,有很多跟雇員相同的屬性如姓名,薪水,以及方法,如取姓名,取薪水,但是它也有自己獨有的屬性和方法,還可以重載父類的方法,如上面的getSalary。這里的Manager類對象,繼承了父類Employee的方法,因此Manager對象可以直接使用getName()方法,重載了getSalary方法,因此調(diào)用Manager對象的該方法時,調(diào)用的是子類的getSalary方法,而不是父類,

  那到底可以繼承父類的哪些信息呢?

  1.子類可以繼承父類的成員變量

  當子類繼承了某個類之后,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:

  1)能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;

  2)對于父類的包訪問權(quán)限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

  3)對于子類可以繼承的父類成員變量,如果在子類中出現(xiàn)了同名稱的成員變量,則會發(fā)生隱藏現(xiàn)象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中訪問父類中同名成員變量,需要使用super關(guān)鍵字來進行引用。

  2.子類繼承父類的方法

  同樣地,子類也并不是完全繼承父類的所有方法。

  1)能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;

  2)對于父類的包訪問權(quán)限成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

  3)對于子類可以繼承的父類成員方法,如果在子類中出現(xiàn)了同名稱的成員方法,則稱為覆蓋,即子類的成員方法會覆蓋掉父類的同名成員方法。如果要在子類中訪問父類中同名成員方法,需要使用super關(guān)鍵字來進行引用。

  這里說了很多次public,private和protected,關(guān)于訪問權(quán)限好像沒還有正式介紹,這里來順便簡單介紹一下吧:

  Java類具有三種訪問控制符:private、protected和public,同時當不寫這三個訪問控制符時,表現(xiàn)為一種默認的訪問控制狀態(tài)。因此,一共具有四種訪問控制級別。

  具體訪問控制表現(xiàn)如下:

  private修飾的屬性或方法為該類所特有,在任何其他類中都不能直接訪問;

  default修飾的屬性或方法具有包訪問特性,同一個包中的其他類可以訪問;

  protected修飾的屬性或方法在同一個中的其他類可以訪問,同時對于不在同一個包中的子類中也可以訪問;

  public修飾的屬性或方法外部類中都可以直接訪問。

  為什么要引入訪問權(quán)限這個概念呢?當然是為了更好的封裝,就像制作一臺機器一樣,自然希望把所有的電線都藏在盒子里而不是大搖大擺的吊在外面被人吐槽,而且這樣也更加安全,只給用戶或用戶程序員看那些想給他們看的內(nèi)容就好了,其他的一律隱藏起來。

  子類Manager雖然沒有繼承父類Employee的name和salary屬性,但不代表對這兩個屬性的操作沒有意義,可以理解成一個子類對象中包含有一個父類對象,打個比方,就像是我們組裝好幾款不同的電腦,為了方便起見可以選用同一款主機箱,里面配置了相同的電源和風扇,而其它的配置每臺電腦都可以不一樣,甚至如果需要的話,某些電腦還可以更換一下風扇和電源,雖然最后性能可能相去甚遠,但是從外表上看起來,它們都是差不多的。(當然,如果你非要改裝的完全不一樣也是可以的)這里的配置好風扇跟電源的主機箱就相當于我們的父類,而不同的電腦就相當于子類,子類可以調(diào)用父類的公開方法,如轉(zhuǎn)動風扇,但不能直接改變主機箱的顏色,因為父類并沒有提供這樣的權(quán)限。但這不代表主機箱的顏色對于子類沒有用,它仍屬于子類的一部分,只是不能直接操作它罷了。

  訪問權(quán)限的內(nèi)容就介紹到這里了,現(xiàn)在回歸到我們的繼承上來,下面是使用Manager類的一個栗子:

public class ManagerTest {
  public static void main(String[] args){
    Manager boss = new Manager("Frank",100000);//定義一個Manager變量
    boss.setBonus(10000);//設(shè)置獎金

    Employee[] staff = new Employee[3];//創(chuàng)建一個Employee數(shù)組
          //給數(shù)組賦值
    staff[0] = boss;
    staff[1] = new Employee("Alan",8000);
    staff[2] = new Employee("Tom",9000);
     //遍歷輸出數(shù)組元素
    for (Employee e:staff)
      System.out.println("name:"+e.getName()+" salary:"+e.getSalary());
  }
}

  這里我們定義了一個Employee數(shù)組,然后把一個Manager變量賦值給了Employee數(shù)組的第一個元素,看到這里,你也許會感到疑惑,不是說只能在相同類型的變量之間使用賦值操作嗎?確實如此,但是因為Manager類是Employee的子類,一個Manager對象同時具有Employee的所有屬性跟方法,也就是說Employee能做的事情,它也同樣能做,所以,把Manager類的變量賦值給Employee變量是沒有問題的,但反之則不行,因為Manager類有它自己的方法setBonus(),Employee是無法實現(xiàn)。在遍歷輸出的時候,我們把所有元素都當成Employee對象來使用,輸出如下:

name:Frank salary:110000.0
name:Alan salary:8000.0
name:Tom salary:9000.0

  boss變量,在調(diào)用getSalary方法的時候,顯然是調(diào)用了子類的方法,將基本薪水加上了獎金之后才進行返回。

  那說了這么多,為什么非要使用繼承呢?

  原因很簡單,一個是可以實現(xiàn)代碼的復用,像這個例子一樣,Employee的getName方法被子類Manager復用了,Manager中可以直接使用這個方法,這樣可以省去很多代碼。

  其次是可以實現(xiàn)多態(tài),說出來你可能不信,我們剛才的栗子已經(jīng)使用到了一個很偉大的概念——多態(tài),在遍歷輸出的時候,一個父類對象的引用指向了子類對象,并調(diào)用了子類方法。

  那么這樣做的好處是什么呢?多態(tài)的意義何在?

  簡單,方便,繼續(xù)用我們剛才的栗子,假如我們現(xiàn)在有一個人事管理類,PersonnelManagement,需要對員工的信息進行錄入,有一個record方法,我們?nèi)绻褂昧硕鄳B(tài)的特性,只需要給record方法傳入一個Employee對象即可,不管是經(jīng)理還是普通雇員都能使用相同的方式進行處理,否則我們需要為經(jīng)理跟雇員分別設(shè)計一個方法,這樣也許覺得沒事,但如果現(xiàn)在又多了很多其它崗位,如總經(jīng)理,副經(jīng)理,經(jīng)理助手,人事部經(jīng)理,采購部經(jīng)理,這時候你還能為每個崗位設(shè)計一個方法嗎?顯然不現(xiàn)實,而且這樣就失去了可擴展性跟靈活性,把一門藝術(shù)活變成了體力活,這樣會讓你喪失對編程的樂趣。

  所以,繼承跟多態(tài)其實也很簡單,繼承就是使用extends來繼承父類的屬性跟方法,多態(tài)則是可以在合適的時候?qū)⒆宇悓ο笠暈楦割悓ο筮M行統(tǒng)一處理,從而實現(xiàn)和增加代碼的復用度,讓你的代碼越來越風騷。

  至此類的繼承與多態(tài)就講解完畢了,歡迎大家繼續(xù)關(guān)注!喜歡我的教程的話記得動動小手點下推薦,也歡迎關(guān)注我的博客。

以上就是Java必須學會的類的繼承與多態(tài)的詳細內(nèi)容,更多關(guān)于Java類的繼承與多態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot之自定義全局異常處理的實現(xiàn)

    Springboot之自定義全局異常處理的實現(xiàn)

    這篇文章主要介紹了Springboot之自定義全局異常處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Spring Boot 與DBunit 配合使用方法

    Spring Boot 與DBunit 配合使用方法

    這篇文章主要介紹了Spring Boot 與DBunit 配合使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • SpringBoot實現(xiàn)elasticsearch索引操作的代碼示例

    SpringBoot實現(xiàn)elasticsearch索引操作的代碼示例

    這篇文章主要給大家介紹了SpringBoot如何實現(xiàn)elasticsearch 索引操作,文中有詳細的代碼示例,感興趣的同學可以參考閱讀下
    2023-07-07
  • 在java中ArrayList集合底層的擴容原理

    在java中ArrayList集合底層的擴容原理

    這篇文章主要介紹了在java中ArrayList集合底層的擴容原理,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • 關(guān)于java中多個JDK和切換版本介紹

    關(guān)于java中多個JDK和切換版本介紹

    大家好,本篇文章主要講的是關(guān)于java中多個JDK和切換版本介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 詳解Spring中@Component和@Configuration的區(qū)別

    詳解Spring中@Component和@Configuration的區(qū)別

    一直有同學搞不清Spring中@Component和@Configuration這兩個注解有什么區(qū)別,所以這篇文章小編就給大家簡單介紹一下@Component和@Configuration的區(qū)別,需要的朋友可以參考下
    2023-07-07
  • IntelliJ?IDEA無公網(wǎng)遠程Linux服務(wù)器環(huán)境開發(fā)過程(推薦收藏)

    IntelliJ?IDEA無公網(wǎng)遠程Linux服務(wù)器環(huán)境開發(fā)過程(推薦收藏)

    下面介紹如何在IDEA中設(shè)置遠程連接服務(wù)器開發(fā)環(huán)境并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實現(xiàn)無公網(wǎng)遠程連接,然后實現(xiàn)遠程Linux環(huán)境進行開發(fā),感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Feign如何解決服務(wù)之間調(diào)用傳遞token

    Feign如何解決服務(wù)之間調(diào)用傳遞token

    這篇文章主要介紹了Feign如何解決服務(wù)之間調(diào)用傳遞token,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 5分鐘快速創(chuàng)建spring boot項目的完整步驟

    5分鐘快速創(chuàng)建spring boot項目的完整步驟

    這篇文章主要給大家介紹了關(guān)于通過5分鐘快速創(chuàng)建spring boot項目的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • SpringBoot為啥不用配置啟動類的實現(xiàn)

    SpringBoot為啥不用配置啟動類的實現(xiàn)

    這篇文章主要介紹了SpringBoot為啥不用配置啟動類的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論