0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全面講解?向?qū)ο缶幊倘?特性 1

jf_78858299 ? 來源:小牛呼嚕嚕 ? 作者:小牛呼嚕嚕 ? 2023-02-09 14:24 ? 次閱讀

封裝

把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向?qū)ο蟮奶卣髦?,是對象和類概念的主要特性?/p>

通俗地說,一個類就是一個封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實體。在一個對象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問。

通過這種方式,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護,以防止程序中無關(guān)的部分意外的改變或錯誤地使用了對象的私有部分。但是如果?個類沒有提供給外界訪問的?法,那么這個類也沒有什么意義了。

我們來看一個常見的 類,比如:Student

public class Student implements Serializable {
    
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

將對象中的成員變量進行私有化,外部程序是無法訪問的。對外提供了訪問的方式,就是set和get方法。

而對于這樣一個實體對象,外部程序只有賦值和獲取值的權(quán)限,是無法對內(nèi)部進行修改

繼承

繼承 就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

Java 中通過 extends 關(guān)鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:

class 父類 {
}
 
class 子類 extends 父類 {
}

繼承概念的實現(xiàn)方式有二類:實現(xiàn)繼承接口繼承。

實現(xiàn)繼承是指直接使用基類的屬性和方法而無需額外編碼的能力

接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現(xiàn)的能力

一般我們繼承基本類和抽象類用 extends 關(guān)鍵字,實現(xiàn)接口類的繼承用 implements 關(guān)鍵字。

注意點:

通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。

繼承的過程,就是從一般到特殊的過程。要實現(xiàn)繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現(xiàn)。

子類可以擁有父類的屬性和方法。

子類可以擁有自己的屬性和方法, 即?類可以對?類進?擴展。

子類可以重寫覆蓋父類的方法。

JAVA 只支持單繼承 ,即一個子類只允許有一個父類,但是可以實現(xiàn)多級繼承,及子類擁有唯一的父類,而父類還可以再繼承。

使用 implements 關(guān)鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時繼承多個接口(接口跟接口之間采用逗號分隔)。

# implements 關(guān)鍵字

public interface A {
    public void eat();
    public void sleep();
}
 
public interface B {
    public void show();
}
 
public class C implements A,B {
}

值得留意的是:關(guān)于父類私有屬性和私有方法的繼承 的討論

這個網(wǎng)上 有大量的爭論,我這邊以Java官方文檔為準(zhǔn):

With the use of the extends keyword, the subclasses will be able to inherit all the properties of the superclass except for the private properties of the superclass.

子類不能繼承父類的 私有屬性事實),但是如果子類中公有的方法影響到了父類私有屬性,那么私有屬性是能夠被子類使用的。

官方文檔 明確說明:privatefinal不被繼承,但從內(nèi)存的角度看的話:父類private屬性是會存在于子類對象中的。

通過繼承的方法(比如,public方法)可以訪問到父類的private屬性

如果子類中存在與父類private方法簽名相同的方法,其實相當(dāng)于覆蓋

個人覺得文章里的一句話很贊,我們不可能完全繼承父母的一切(如性格等),但是父母的一些無法繼承的東西卻仍會深刻的影響著我們。

多態(tài)

同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力就是 多態(tài) 。網(wǎng)上的爭論很多,筆者個人認同網(wǎng)上的這個觀點:重載也是多態(tài)的一種表現(xiàn),不過多態(tài)主要指運行時多態(tài)

Java 多態(tài)可以分為 重載式多態(tài)重寫式多態(tài)

-重載式多態(tài),也叫編譯時多態(tài)。編譯時多態(tài)是靜態(tài)的,主要是指方法的重載,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的方法。通過編譯之后會變成兩個不同的方法,在運行時談不上多態(tài)。也就是說這種多態(tài)再編譯時已經(jīng)確定好了。

-重寫式多態(tài),也叫運行時多態(tài)。運行時多態(tài)是動態(tài)的,主要指繼承父類和實現(xiàn)接口時,可使用父類引用指向子類對象實現(xiàn)。 這個就是大家通常所說的多態(tài)性

這種多態(tài)通過動態(tài)綁定(dynamic binding)技術(shù)來實現(xiàn),是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。也就是說,只有程序運行起來,你才知道調(diào)用的是哪個子類的方法。這種多態(tài)可通過函數(shù)的重寫以及向上轉(zhuǎn)型來實現(xiàn)。

多態(tài)存在的三個必要條件:

繼承

重寫

父類引用指向子類對象:Parent p = new Child();

我們一起來看個例子,仔細品讀代碼,就明白了:

@SpringBootTest
class Demo2021ApplicationTests {

    class Animal {
        public void eat(){
            System.out.println("動物吃飯!");
        }
        public void work(){
            System.out.println("動物可以幫助人類干活!");
        }
    }

    class Cat extends Animal {
        public void eat() {
            System.out.println("吃魚");
        }
        public void sleep() {
            System.out.println("貓會睡懶覺");
        }
    }

    class Dog extends Animal {
        public void eat() {
            System.out.println("吃骨頭");
        }
    }

    @Test
    void contextLoads() {
        //part1
        Cat cat_ = new Cat();
        cat_.eat();
        cat_.sleep();
        cat_.work();

        //part2
        Animal cat=new Cat();
        cat.eat();
        cat.work();
        cat.sleep();//此處編譯會報錯。

        Animal dog=new Dog();
        dog.eat();//結(jié)果為:吃骨頭。此處調(diào)用子類的同名方法。
        
  //part3
        //如果想要調(diào)用父類中沒有的方法,則要向下轉(zhuǎn)型,這個非常像"強轉(zhuǎn)"
        Cat cat222 = (Cat)cat;        // 向下轉(zhuǎn)型(注意,如果是(Cat)dog 則會報錯)
        cat222.sleep();        //結(jié)果為:貓會睡懶覺。 可以調(diào)用 Cat 的 sleep()
    }



}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7077

    瀏覽量

    89161
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7937

    瀏覽量

    143083
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4798

    瀏覽量

    68725
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式C語言面向對象編程---多態(tài)

    前兩篇文章主要講述了 C 語言面向對象編程– 封裝和繼承。本篇文章繼續(xù)來討論一下,如何使用 C 語言實現(xiàn)面向對象編程的另一個重要特性:多態(tài)。
    發(fā)表于 10-31 14:41 ?1015次閱讀

    Python的面向對象編程詳解

    一般編程可分為面向過程編程,和面向對象編程。Python的面向對象編程,與Java的面向
    發(fā)表于 09-04 16:35 ?574次閱讀
    Python的面向<b class='flag-5'>對象</b><b class='flag-5'>編程</b>詳解

    每日一教labview視頻教程【12.15】labview面向對象編程(上)

    面向對象編程視頻:專家從類開始進行講解,詳細說明了如何進行面向對象編程。http://yunpan.cn/lk/480ep
    發(fā)表于 12-15 10:35

    【原創(chuàng)視頻】小草手把手LABVIEW之OOP面向對象編程基礎(chǔ)(1

    =a2hzp.8244740.0.0-------------------------------------視頻內(nèi)容:LabVIEW面向對象編程OOP介紹(分多個小節(jié),本視頻只是最初一個小節(jié),只是介紹)時長:14分鐘
    發(fā)表于 05-23 01:02

    編程魔法師大思想視頻宣傳片

    ,講解了單片機裸編程項目的設(shè)計實現(xiàn)過程,并通過一只電機對象到兩只電機對象的設(shè)計演變過程,深入講解了數(shù)碼分離、線程實現(xiàn)、
    發(fā)表于 04-23 21:46

    LabVIEW面向對象的ActorFramework(1

    、維護、迭代。如果想要更好的學(xué)習(xí)這個概念,推薦兩本講解的面向對象編程很經(jīng)典的圖書:1.《面向對象的思考過程》2.《面向
    發(fā)表于 02-10 14:09

    面向對象編程及其特性 精選資料分享

    編程語言分為面向過程編程、函數(shù)式編程和面向對象編程。其實python就是一種面向對象
    發(fā)表于 07-21 08:38

    面向對象編程介紹

    目錄一、面向對象編程介紹1.面向過程編程2.函數(shù)式編程3.面向對象
    發(fā)表于 12-13 07:22

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構(gòu)建多線程架構(gòu)與增量多線程編程技術(shù)。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    對象特性的測定

    對象特性的測定 一、 實驗?zāi)康?b class='flag-5'>1、通過實驗了解對象的靜態(tài)和動態(tài)特性;2、掌握對象靜態(tài)和動態(tài)
    發(fā)表于 05-17 10:53 ?14次下載

    面向對象編程練習(xí)

    實驗 3 面向對象編程練習(xí) 一、實驗?zāi)康?    通過編程和上機實驗理解 Java 語言是如何體現(xiàn)面向對象編程
    發(fā)表于 09-23 18:57 ?3053次閱讀

    LabVIEW 網(wǎng)絡(luò)講壇第四季:面向對象編程的應(yīng)用

    本視頻主要講解了基本概念,以及面向對象編程在LabVIEW中的應(yīng)用。
    的頭像 發(fā)表于 06-25 02:46 ?2904次閱讀
    LabVIEW 網(wǎng)絡(luò)講壇第四季:面向<b class='flag-5'>對象</b>的<b class='flag-5'>編程</b>的應(yīng)用

    Labview面向對象編程快速入門教程

    在面向對象編程中, 類用來表示通用特性。 例如,假設(shè)有一個描述汽車的類。 類中定義了各種汽車的通用特性。對象是類的特定實例。汽車類的一個
    發(fā)表于 07-31 08:00 ?82次下載
    Labview面向<b class='flag-5'>對象</b><b class='flag-5'>編程</b>快速入門教程

    全面講解?對象編程?特性 2

    這塊就比較特殊了,我們一句句來看 `Animal cat=new Cat();` 像這種這個 `父類引用指向子類對象`,這種現(xiàn)象叫做:**"向上轉(zhuǎn)型"**,也被稱為**多態(tài)
    的頭像 發(fā)表于 02-09 14:25 ?309次閱讀
    <b class='flag-5'>全面</b><b class='flag-5'>講解</b>?<b class='flag-5'>向</b><b class='flag-5'>對象</b><b class='flag-5'>編程</b><b class='flag-5'>三</b>?<b class='flag-5'>特性</b> 2

    西門子PLC面向對象編程

    面向對象編程是計算機高級語言的一種高級編程模式,這種設(shè)計思想也可以應(yīng)用于工業(yè)控制系統(tǒng)的plc程序中。雖然我們 無法實現(xiàn)面向對象編程的許多優(yōu)
    發(fā)表于 04-17 11:41 ?7次下載
    西門子PLC面向<b class='flag-5'>對象</b><b class='flag-5'>編程</b>