最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java繼承與多態(tài)的正確打開方式

 更新時間:2022年01月07日 09:22:03   作者:Lucky_mzc  
這篇文章主要為大家介紹了Java的繼承與多態(tài),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一.概述  

面向?qū)ο蟪绦蛟O(shè)計的三大原則是封裝性,繼承性和多態(tài)性。繼承性是子類自動共享父類的數(shù)據(jù)和方法的機(jī)制,它是由類的派生功能體現(xiàn)的。繼承具有傳遞性,使得一個類可以繼承另一個類的屬性和方法,這樣通過抽象出共同的屬性和方法組件新的類,便于代碼的重用。而多態(tài)是指不同類型的對象接收相同的消息時產(chǎn)生不同的行為,這里的消息主要是對類成員函數(shù)的調(diào)用,而不同的行為是指類成員函數(shù)的不同實現(xiàn)。當(dāng)對象接收到發(fā)送給它的消息時,根據(jù)該對象所屬的類,動態(tài)選用在該類中定義的實現(xiàn)算法。

二.繼承

2.1 繼承的概述

在現(xiàn)實中存在很多如圖所示的關(guān)系:

出租車,卡車和公交車都是汽車的一種,分別擁有相似的特征。例如,引擎的數(shù)量,外觀顏色等。它們擁有相似的行為,如剎車和加速的功能。但是每種不同的交通工具又有自己的特征,如公交車擁有和其他交通工具不同的特性和行為——最大載客數(shù)量和到指定站點(diǎn)要報站的特點(diǎn),而卡車的主要功能是送貨物,也就是載貨和卸貨,因此擁有最大載重量的特性。

在面向?qū)ο蟮某绦蛟O(shè)計中該怎樣描述現(xiàn)實世界的這種狀況呢?這就用到繼承的概念。

所謂繼承,就是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。已有的類一般稱為父類(基類或超類),這個過程也稱為類的派生。由基類產(chǎn)生的新類稱為派生類或子類,派生類同樣可以作為基類再派生新的子類,這樣就形成了類間的層次結(jié)構(gòu)。

基類和派生類類的關(guān)系如下:

  • 基類是派生類的抽象(基類抽象了派生類的公共特征)。
  • 派生類是對基類的擴(kuò)展。
  • 派生類和基類的關(guān)相當(dāng)于“是一個(is a)”的關(guān)系,即派生類是基類的一個對象,而不是“有(has)”的關(guān)系,即類的對象包含一個或多個其他類的對象作為該類的屬性。

2.2 繼承機(jī)制

定義教師類,其中一類教師為Net教師,屬性為姓名,所屬部門,方法為授課,自我介紹。

public class NetTeacher {
   private String name;
   private String school;
   public NetTeacher(String myName,String mySchool){
      name = myName;
      school = mySchool;
   }
   public void giveLession(){
      System.out.println("啟動 VS2021 ");
      System.out.println("知識點(diǎn)講解");
      System.out.println("總結(jié)提問");
   }
   public void introduction(){
      System.out.println("大家好!我是" + schoool + "的" + name + " 。");
   }
}

定義教師類,其中一類教師為Java教師,屬性為姓名,所屬部門,方法為授課,自我介紹。

public class JavaTeacher {
   private String name;
   private String school;
   public JavaTeacher(String myName,String mySchool){
      name = myName;
      school = mySchool;
   }
   public void giveLession(){
      System.out.println("啟動 IDEA2021 ");
      System.out.println("知識點(diǎn)講解");
      System.out.println("總結(jié)提問");
   }
   public void introduction(){
      System.out.println("大家好!我是" + schoool + "的" + name + " 。");
   }
}

在程序處理中,發(fā)現(xiàn)兩個類的定義非常相似,有很多相同點(diǎn),如教師的屬性姓名,所屬部門類似,類的方法也基本相同。

針對這種情況,將Java教師類和Net教師類的共性抽取出來,形成父類Teacher類,使得Net教師和Java教師成為Teacher類的子類,則子類繼承父類的基本屬性和方法,就簡化了子類的定義。上述代碼可以修改如下:

public class Teacher {
   private String name;
   private String school;
   public Teacher(String myName,String mySchool){
      name = myName;
      school = mySchool;
   }
   public void giveLession(){
      System.out.println("知識點(diǎn)講解");
      System.out.println("總結(jié)提問");
   }
   public void introduction(){
      System.out.println("大家好!我是" + schoool + "的" + name + " 。");
   }
}
 
子類JavaTeacher:
public class JavaTeacher extends Teacher {
   public JavaTeacher(String myName,String mySchool){
      super(myName,mySchool);
   }
   public void giveLession(){
      System.out.println("啟動 IDEA2021 ");
      super.giveLession;
   }
 
子類NetTeacher:
public class NetTeacher extends Teacher {
   public NetTeacher(String myName,String mySchool){
      super(myName,mySchool);
   }
   public void giveLession(){
      System.out.println("啟動 VS2021 ");
      super.giveLession;
   }

子類自動繼承父類的屬性和方法,子類中不再存在重復(fù)代碼,從而實現(xiàn)代碼的重用。

通過關(guān)鍵字 extends,分別創(chuàng)建父類 Teacher 的子類 JavaTeacher 和 NetTecher 。子類繼承父類所有的成員變量和成員方法,但不能繼承父類的構(gòu)造方法。在子類的構(gòu)造方法中,可使用語句super (參數(shù)列表)調(diào)用父類的構(gòu)造方法,如子類構(gòu)造方法中的語句 super(myName,mySchool)。

extends 說明要構(gòu)建一個新類,該類從已存在的類派生而來。派生的定義過程,實際是經(jīng)歷了以下幾個過程:

  • 子類繼承父類中被聲明為 public 和 protected 的成員變量和成員方法,但是不能繼承被聲明為 private 的成員變量和成員方法。
  • 重寫父類成員,包括數(shù)據(jù)成員和成員函數(shù)。如果子類聲明了一個與父類成員函數(shù)相同的成員函數(shù),子類中的新成員則屏蔽了父類同名成員,類似函數(shù)中的局部變量屏蔽了全局變量,稱為同名覆蓋(Overriding)。
  • 定義新成員。新成員是派生類自己的新特性。派生類新成員的加入使得派生類在功能上有所發(fā)展。
  • 必須在派類中重寫構(gòu)造方法,因為構(gòu)造方法不能繼承。

2.3 類中屬性,方法的繼承與覆蓋

1.屬性的繼承與覆蓋

子類可以繼承父類的所有非私有屬性。

子類也可以覆蓋繼承的成員變量,對于子類可以從父類繼承的成員變量,只要子類中定義的成員變量和父類中的成員變量同名,子類就覆蓋了繼承的成員變量。

當(dāng)子類執(zhí)行它自己定義的方法時,所操作的就是它自己定義的數(shù)據(jù)成員,,從而覆蓋父類繼承來的數(shù)據(jù)成員。

2.方法的繼承與覆蓋

父類中非私有( private )方法可以被子類所繼承。

在子類繼承父類的成員方法時,應(yīng)注意一下兩項:

  • 子類不能訪問父類的 private 成員方法,但子類可以訪問父類的 piblic ,protected 成員方法。
  • 訪問 protected 時,子類和同一包內(nèi)的方法都能訪問父類的 protected 成員方法,但其他方法不能訪問。

方法的覆蓋是指子類中定義一個方法,并且這個方法的名字,返回類型,參數(shù)列表與父類繼承的方法完全相同。

2.4 super 關(guān)鍵字

子類不能繼承父類的構(gòu)造方法。

如果基類中沒有默認(rèn)構(gòu)造方法或希望調(diào)用帶參數(shù)的基類構(gòu)造方法,要使用關(guān)鍵字 super 來顯示調(diào)用基類構(gòu)造方法。使用關(guān)鍵字 super 調(diào)用基類構(gòu)造方法的語句,必須是子類構(gòu)造方法的第一個可執(zhí)行語句。調(diào)用基類構(gòu)造方法時,傳遞的參數(shù)不能是關(guān)鍵字 this 或當(dāng)前對象的非靜態(tài)成員。

super 關(guān)鍵字主要應(yīng)用于繼承關(guān)系實現(xiàn)子類對父類方法的調(diào)用,包括對父類構(gòu)造方法和一般方法的調(diào)用。具體使用方法如下:

(1)子類的構(gòu)造方法如果要引用 super ,必須把 super 放在構(gòu)造方法的第一個可執(zhí)行語句。例如:

public CommonEmployee (String name,double bonus){
   super (name);                         //通過 super () 的調(diào)用,給父類的數(shù)據(jù)成員賦初值
   this.bonus = bonus;                   // this 指當(dāng)前對象
   System.out.println("子類構(gòu)造方法的調(diào)用");
}

(2)在 Java 中,有時還會遇到子類中的成員變量或方法與父類中的成員變量或方法同名。同名子類中的成員變量或方法名優(yōu)先級高,所以子類中的同名成員變量或方法覆蓋了父類的成員變量或方法,但是我們?nèi)绻胍褂酶割愔械倪@個成員變量或方法,就需要用到 super .

(3)可以用 super 直接傳遞參數(shù)。見下面代碼:

public class Person {
    Person(){
        prt("A Person.");
    }
    Person(String name){
        prt("A person name is:" + name);
    }
    public static void prt(String s){
        System.out.println(s);
    }
}
 
public class Chinese extends Person {
    Chinese(){
        super();                     //調(diào)用父類無形參構(gòu)造方法
        prt("A chinese");         //調(diào)用父類的方法prt
    }
    Chinese(String name){
        super(name);                 //調(diào)用父類具有相同形參的構(gòu)造方法
        prt("his name is:" + name);
    }
    Chinese(String name,int age){
        this(name);                  //調(diào)用當(dāng)前具有相同形參的構(gòu)造方法
        prt("his age is:" + age);
    }
 
    public static void main(String[] args) {
        Chinese cn = new Chinese();
        cn = new Chinese("Kevin");
        cn = new Chinese("Jhone",21);
    }
}

 程序分析如下:

  • main()中首先構(gòu)建Chinese的第一個對象cn, 語句cn = new Chinese()調(diào)用子類無參的構(gòu)造方法Chinese(),在構(gòu)造方法中super()語句調(diào)用父類的無參構(gòu)造方法Person(),在父類無參的構(gòu)造方法中調(diào)用父類的方法prt(),程序輸出結(jié)果A Person,接下來返回子類的構(gòu)造方法的調(diào)用處,繼續(xù)執(zhí)行下面的語句pr("A chinese."),則調(diào)用父類的方法prt輸出結(jié)果A chinese.結(jié)束第一條語句。
  • 程序繼續(xù)執(zhí)行第二條語句cn = new Chinese("kevin");此時調(diào)用子類具有一 個參數(shù)參的構(gòu)造方法Chinese(name),在構(gòu)造方法中super(name)語句調(diào)用父類的有參構(gòu)造方法prt("A person name is:"+ name),程序輸出結(jié)果A person name is:kevin,接下來返回子類的構(gòu)造方法的調(diào)用處,繼續(xù)執(zhí)行下面的語句prt("his name is:"+ name),則調(diào)用父類的方法prt輸出結(jié)果his name is:kevin,結(jié)束第二條語句。
  • 接下來程序繼續(xù)執(zhí)行第三條語句cn = new Chinese("Jhone,"22);程序執(zhí)行時先調(diào)用子類具有兩個參數(shù)參的構(gòu)造方法Chinese(name, age), 在構(gòu)造方法中this ( name )語句則調(diào)用的是當(dāng)前具有相同參數(shù)的構(gòu)造方法,即調(diào)用子類具有一個參數(shù)參的構(gòu)造方法Chinese(name),接下來調(diào)用父類的有參構(gòu)造方法Person(name),為父類的name進(jìn)行初始化,再接下來在父類有參的構(gòu)造方法中調(diào)用父類的方法prt("A person name is:"+ name),程序輸出結(jié)果A person name is: Jhone,接下來返回子類的構(gòu)造方法的調(diào)用處,繼續(xù)執(zhí)行下面的語句prt("his name is:"+ name),則調(diào)用父類的方法prt輸出結(jié)果his name is: Jhone,調(diào)用結(jié)束后程序返回子類構(gòu)造方法Chinese(name,age)執(zhí)行語句prt("his age is:"+ age); 輸出結(jié)果his age is:22,結(jié)束第二條語句。

三. 多態(tài)

多態(tài)是指在父類中定義的屬性和方法被子類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義。

對面向?qū)ο髞碚f,多態(tài)分為編譯時多態(tài)和運(yùn)行時多態(tài)。其中編譯時多態(tài)是靜態(tài)的,主要是指方法的重載,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的方法。通過編譯之后會變成兩個不同的方法,在運(yùn)行時談不上多態(tài)。而運(yùn)行時多態(tài)是動態(tài)的,它是通過動態(tài)綁定來實現(xiàn)的,也就是大家通常所說的多態(tài)性。

Java  實現(xiàn)多態(tài)有 3 個必要條件:繼承、重寫和向上轉(zhuǎn)型。只有滿足這 3 個條件,開發(fā)人員才能夠在同一個繼承結(jié)構(gòu)中使用統(tǒng)一的邏輯實現(xiàn)代碼處理不同的對象,從而執(zhí)行不同的行為。

  • 繼承:在多態(tài)中必須存在有繼承關(guān)系的子類和父類。
  • 重寫:子類對父類中某些方法進(jìn)行重新定義,在調(diào)用這些方法時就會調(diào)用子類的方法。
  • 向上轉(zhuǎn)型:在多態(tài)中需要將子類的引用賦給父類對象,只有這樣該引用才既能可以調(diào)用父類的方法,又能調(diào)用子類的方法。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • 關(guān)于RequestMapping注解的作用說明

    關(guān)于RequestMapping注解的作用說明

    這篇文章主要介紹了關(guān)于RequestMapping注解的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java this、final等關(guān)鍵字總結(jié)

    Java this、final等關(guān)鍵字總結(jié)

    這篇文章主要對java中this、final等關(guān)鍵字進(jìn)行了總結(jié),需要的朋友可以參考下
    2017-04-04
  • IDEA創(chuàng)建Maven工程Servlet的詳細(xì)教程

    IDEA創(chuàng)建Maven工程Servlet的詳細(xì)教程

    這篇文章主要介紹了IDEA創(chuàng)建Maven工程Servlet的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java實現(xiàn)入?yún)?shù)據(jù)批量數(shù)據(jù)校驗詳解

    Java實現(xiàn)入?yún)?shù)據(jù)批量數(shù)據(jù)校驗詳解

    在業(yè)務(wù)處理中一般入?yún)⑹菃螚l數(shù)據(jù),這樣數(shù)據(jù)校驗比較容易,但是這種方法對于集合數(shù)據(jù)的校驗不適用,下面我們就來看看如何對入?yún)?shù)據(jù)進(jìn)行批量數(shù)據(jù)校驗吧
    2024-02-02
  • Java實現(xiàn)AES加密和解密方式完整示例

    Java實現(xiàn)AES加密和解密方式完整示例

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)AES加密和解密方式的相關(guān)資料,AES加密為最常見的對稱加密算法,是一種區(qū)塊加密標(biāo)準(zhǔn),這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用,需要的朋友可以參考下
    2023-10-10
  • .NET程序員如何入門Spring Boot詳解

    .NET程序員如何入門Spring Boot詳解

    這篇文章主要介紹了.NET程序員如何快入門Spring Boot,微軟給VS Code提供了編寫Java的插件,你可以在VS Code上愉快地寫Java。,需要的朋友可以參考下
    2019-06-06
  • Java使用正則表達(dá)式演示電話與郵箱格式

    Java使用正則表達(dá)式演示電話與郵箱格式

    本文詳細(xì)講解了Java正則表達(dá)式的用法,舉例演示電話和郵箱格式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 基于Java多線程notify與notifyall的區(qū)別分析

    基于Java多線程notify與notifyall的區(qū)別分析

    本篇文章對Java中多線程notify與notifyall的區(qū)別進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • RocketMQ設(shè)計之同步刷盤

    RocketMQ設(shè)計之同步刷盤

    這篇文章主要介紹了RocketMQ設(shè)計之同步刷盤,文章主要通過CommitLog的handleDiskFlush方法展開全文內(nèi)容,實現(xiàn)同步刷盤,下面文章詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • Mybatis?selectKey 如何返回新增用戶的id值

    Mybatis?selectKey 如何返回新增用戶的id值

    這篇文章主要介紹了Mybatis?selectKey 如何返回新增用戶的id值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

扎兰屯市| 抚州市| 望奎县| 舞阳县| 晋江市| 中阳县| 屏南县| 辰溪县| 盐源县| 石柱| 桦甸市| 青浦区| 雷州市| 灵山县| 九寨沟县| 大足县| 永福县| 应城市| 宜宾县| 漳浦县| 辛集市| 民丰县| 丹棱县| 江山市| 安新县| 筠连县| 太谷县| 思南县| 中阳县| 苍梧县| 罗甸县| 龙泉市| 嘉鱼县| 桐梓县| 合山市| 抚顺市| 镇平县| 昌乐县| 弥渡县| 敖汉旗| 和林格尔县|