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

Java OOP三大特征之封裝繼承與多態(tài)詳解

 更新時(shí)間:2022年07月25日 08:55:49   作者:陳亦康  
本文主要講述的是面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài),內(nèi)容含括從封裝到繼承再到多態(tài)的所有重點(diǎn)內(nèi)容以及使用細(xì)節(jié)和注意事項(xiàng),內(nèi)容有點(diǎn)長,請大家耐心看完

OOP語言的三大特征即:面向?qū)ο蟮娜齻€(gè)比較重要的思想

封裝

官話:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外公開接口進(jìn)行交互

通俗講,不讓類外看到實(shí)現(xiàn)的細(xì)節(jié),通過技術(shù)手段對這些細(xì)節(jié)包裝一個(gè)外殼,同時(shí)提供幾個(gè)公開的接口,讓你進(jìn)行交互即可(例如:手機(jī),內(nèi)部的具體零件,不會(huì)讓你觀察到,使用者只能看到外殼,通過外殼的顯示屏,充電口進(jìn)行交互)簡而言之——套殼屏蔽細(xì)節(jié)

實(shí)際上通過private來實(shí)現(xiàn)

例如:

繼承

面向?qū)ο蟮乃枷胫刑岢隽死^承的概念,專門用來進(jìn)行共性抽取,實(shí)現(xiàn)代碼復(fù)用。

通俗來講,就是將兩個(gè)或多個(gè)類(“子類”或者叫“派生類”)的共同的特點(diǎn)抽取出來,放在一個(gè)類(“父類”或叫“基類”或叫“超類”)里面,對具有共同特點(diǎn)的代碼實(shí)現(xiàn)重復(fù)利用,大大的減少了代碼量。

例如:人與人之間具有相同的屬性(都有名字,年齡...),但同時(shí)也有不一樣的地方(每個(gè)人具體的特點(diǎn),有人會(huì)彈鋼琴...)

父與子的繼承順序:

故名思意,肯定是先有父后有子,所以在子類構(gòu)造對象時(shí),他們的初始化順序是先完成父類的初始化,再調(diào)用子類的構(gòu)造方法,{ super()將父類初始化好的內(nèi)存地址傳入 },最后完成子類初始化。

super關(guān)鍵字:

1.super.data訪問父類中的屬性

2.super.func() 訪問父類的方法

3.super() 訪問父類的構(gòu)造方法

注意:

this()用來調(diào)用本類的構(gòu)造方法,super()用于調(diào)用父類的構(gòu)造方法,這兩不能同時(shí)出現(xiàn)!

父類與子類同名時(shí),在子類調(diào)用同名變量時(shí)采用就近原則(調(diào)用子類)

當(dāng)你未給子類提供構(gòu)造方法時(shí)(或者是父類有不帶參數(shù)的構(gòu)造方法,子類也有構(gòu)造方法,會(huì)自動(dòng)給子類補(bǔ)上super),編譯器會(huì)自動(dòng)補(bǔ)上一個(gè)不帶參數(shù)的構(gòu)造方法(前提是,父類的構(gòu)造方法中不帶參數(shù),因?yàn)榫幾g器只會(huì)自動(dòng)不上不帶參數(shù)的構(gòu)造方法),如下:

class A{
    A(){
        System.out.println("A");
    }
}
class B extends A{
    B(){
        super();//如果程序原沒寫構(gòu)造方法,編譯器會(huì)自己提供一個(gè)這樣的不帶參數(shù)的構(gòu)造方法
    }
}
public class Test{
    public static void main(String[] args){
        new B();
    }
}
class A{
    A(){
        System.out.print("A");
    }
}
class B extends A{
    B(){  //程序會(huì)自動(dòng)補(bǔ)上super,最終打印AB
        System.out.print("B");
    }
}
public class Test{
    public static void main(String[] args){
        new B();
    }
}
class A{
    A(int a){
        System.out.println("A");
    }
}
class B extends A{
    //若父類構(gòu)造方法帶參數(shù),子類不會(huì)自動(dòng)補(bǔ)構(gòu)造方法
    //程序編譯失敗
}
public class Test{
    public static void main(String[] args){
        new B();
    }
}

經(jīng)典筆試題:以下代碼會(huì)打印什么?(初始化順序是什么?)

class Character{
    public int data1;
    public int data2;
    static{
     System.out.println("父類的靜態(tài)內(nèi)部類初始化完成!");
    }
    {
        System.out.println("父類的實(shí)例內(nèi)部類初始化完成!");
    }
    public Character(){
        System.out.println("父類的構(gòu)造方法初始化完成!");
    }
}
class Art extends Character{
    public int data3;
    public int data4;
    static{
        System.out.println("子類的靜態(tài)內(nèi)部類初始化完成!");
    }
    {
        System.out.println("子類的實(shí)例內(nèi)部類初始化完成!");
    }
    public Art(){
        super();
        System.out.println("子類的構(gòu)造方法初始化完成!");
    }
}
public class Test{
    public static void main(String[] args){
        Art art = new Art();
    }
}

運(yùn)行結(jié)果:

分析:

多態(tài)

通俗來講就是:不同人的通過同一種工具可以做出不同的事情

例如:一個(gè)音樂生和一個(gè)美術(shù)生看到一架鋼琴的反應(yīng)是不同的,音樂生可能會(huì)上去彈鋼琴,而美術(shù)生則可能將他畫下來...

實(shí)現(xiàn)多態(tài)的條件:

  • 在父子的繼承關(guān)系下;
  • 子對父進(jìn)行重寫;
  • 用一個(gè)方法調(diào)用父類被重寫的方法;

代碼如下:

//人類
class Human{
    private String name;
    Human(String name){
        setName(name);
    }
    public void action(){
        System.out.println(name + "看到一架鋼琴~");
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
}
//美術(shù)生
class Art extends Human{
    Art(String name){
        super(name);
    }
    public void action(){
        System.out.println(getName() + "開始繪畫鋼琴~");
    }
}
//音樂生
class Music extends Human{
    Music(String name){
        super(name);
    }
    public void action(){
        System.out.println(getName() + "開始彈鋼琴~");
    }
}
public class Test{
    public static void function(Human human){
        human.action();
    }
    public static void main(String[] args){
        Human human1 = new Art("美術(shù)生");
        Human human2 = new Music("音樂生");
        function(human1);
        function(human2);
    }
}

分析:

發(fā)生重寫的條件:

  • 方法名相同;
  • 返回類型相同;
  • 形參類列表相同(個(gè)數(shù)、順序、類型都要一致?。?;
  • static 和 private 修飾的方法不能重寫;
  • 子類訪問修飾符必須大于等于父類訪問修飾符(后面會(huì)出文章專門討論);

此時(shí)會(huì)發(fā)生動(dòng)態(tài)綁定(運(yùn)行時(shí)綁定),其實(shí)此過程編譯的時(shí)候還是調(diào)用父類的,但運(yùn)行時(shí)發(fā)生動(dòng)態(tài)綁定,運(yùn)行子類的;也就是說,父類引用了子類的對象,調(diào)用了這個(gè)重寫的方法,如下圖:

拓展:

向下轉(zhuǎn)型,也有,也就是子類當(dāng)父類用也可,但是比較危險(xiǎn),如下代碼:

public class Test{
    public static void function(Human human){
        human.action();
    }
    public static void main(String[] args){
        Human human = new Human("音樂生");
        Music music = (Music)human;
    }
}

運(yùn)行結(jié)果:

可以這樣理解,不是所有人都是音樂生,所以需要如下改法:(有的人是音樂生)

public class Test{
    public static void function(Human human){
        human.action();
    }
    public static void main(String[] args){
        Human human = new Music("音樂生");//這樣寫便是有些人是音樂生
        if(human instanceof Music) {//保證安全性,向下轉(zhuǎn)型
            Music music = (Music) human;
        };
    }
}

到此這篇關(guān)于Java OOP三大特征之封裝繼承與多態(tài)詳解的文章就介紹到這了,更多相關(guān)Java 封裝 繼承 多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Java設(shè)計(jì)模式之原型模式

    深入理解Java設(shè)計(jì)模式之原型模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之原型模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • Java虛擬機(jī)內(nèi)存結(jié)構(gòu)及編碼實(shí)戰(zhàn)分享

    Java虛擬機(jī)內(nèi)存結(jié)構(gòu)及編碼實(shí)戰(zhàn)分享

    這篇文章主要介紹了Java虛擬機(jī)內(nèi)存結(jié)構(gòu)及編碼實(shí)戰(zhàn)分享,文章圍繞詳細(xì)主題展開相關(guān)資料具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • java并發(fā)數(shù)據(jù)包Exchanger線程間的數(shù)據(jù)交換器

    java并發(fā)數(shù)據(jù)包Exchanger線程間的數(shù)據(jù)交換器

    這篇文章主要為大家介紹了java并發(fā)數(shù)據(jù)包使用數(shù)據(jù)交換器Exchanger來進(jìn)行線程之間的數(shù)據(jù)交換。有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • Springboot AOP開發(fā)教程

    Springboot AOP開發(fā)教程

    AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型,本文給大家介紹Springboot AOP開發(fā)教程,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 解決Java中的強(qiáng)制類型轉(zhuǎn)換和二進(jìn)制表示問題

    解決Java中的強(qiáng)制類型轉(zhuǎn)換和二進(jìn)制表示問題

    這篇文章主要介紹了解決Java中的強(qiáng)制類型轉(zhuǎn)換和二進(jìn)制表示問題,需要的朋友可以參考下
    2019-05-05
  • SpringBoot接收參數(shù)使用的注解實(shí)例講解

    SpringBoot接收參數(shù)使用的注解實(shí)例講解

    這篇文章主要介紹了詳解SpringBoot接收參數(shù)使用的幾種常用注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 一文帶你詳細(xì)認(rèn)識(shí)文件與Java中操作文件

    一文帶你詳細(xì)認(rèn)識(shí)文件與Java中操作文件

    文件處理是任何應(yīng)用程序的重要部分,Java 提供了許多用于創(chuàng)建、讀取、更新和刪除文件的方法,這篇文章主要給大家介紹了關(guān)于認(rèn)識(shí)文件與Java中操作文件的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • 詳解Java并發(fā)編程中的優(yōu)先級隊(duì)列PriorityBlockingQueue

    詳解Java并發(fā)編程中的優(yōu)先級隊(duì)列PriorityBlockingQueue

    PriorityBlockingQueue是Java中實(shí)現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊(duì)列。本文將會(huì)深入解讀PriorityBlockingQueue的源碼實(shí)現(xiàn),感興趣的可以了解一下
    2023-05-05
  • JavaWeb中Servlet的深入講解

    JavaWeb中Servlet的深入講解

    這篇文章主要介紹了JavaWeb中Servlet的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java LinkedHashMap 底層實(shí)現(xiàn)原理分析

    Java LinkedHashMap 底層實(shí)現(xiàn)原理分析

    LinkedHashMap繼承自HashMap實(shí)現(xiàn)了Map接口?;緦?shí)現(xiàn)同HashMap一樣,不同之處在于LinkedHashMap保證了迭代的有序性。其內(nèi)部維護(hù)了一個(gè)雙向鏈表,解決了 HashMap不能隨時(shí)保持遍歷順序和插入順序一致的問題。
    2021-05-05

最新評論

垫江县| 余江县| 平塘县| 碌曲县| 拜城县| 嵊泗县| 阆中市| 贺兰县| 和田县| 郓城县| 昌邑市| 漠河县| 梓潼县| 平昌县| 醴陵市| 九台市| 鹿邑县| 独山县| 云林县| 子长县| 团风县| 长子县| 渝中区| 泰兴市| 云霄县| 台前县| 邯郸县| 云浮市| 卓资县| 高州市| 塔河县| 岐山县| 张北县| 永吉县| 黎平县| 竹北市| 彰化市| 公安县| 资阳市| 锡林郭勒盟| 襄樊市|