中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java面向對象的封裝、繼承和多態

發布時間:2020-06-05 14:35:58 來源:億速云 閱讀:230 作者:Leah 欄目:編程語言

這篇文章的知識點包括:封裝繼承多態的理解、封裝繼承多態的作用以及封裝繼承多態的使用,閱讀完整文相信大家對Java面向對象的封裝、繼承和多態有了一定的認識。

一、封裝(模塊化)

1.問題的引入:

   當我們創建一個類的對象后,可以通過對象.屬性的方式,對對象進行賦值。
這里,賦值操作受到屬性的數據類型和存儲范圍的制約,除次之外,沒有其他制約條件。

   但是,在實際問題中,我們往往需要給屬性賦值加入額外的限制條件,這個條件又不能在屬性聲明時體現

,我們只能通過一個public 方法對屬性進行限制條件的添加(get(),set())
同時,我們需要避免用戶再使用“對象.屬性”進行賦值,則需要將屬性聲明為私有化。
--》此時,針對屬性就體現了封裝。

2.封裝的思想

(1)類的內部數據操作細節自己完成,不允許外部干涉。僅對外暴露少量的方法用于使用
(2)隱藏對象內部的復雜性。只對外公開簡單的接口。便于外界調用,從而提高系統的可擴展性、可維護性。
(3)封裝性的設計思想:把該隱藏的隱藏起來,該暴露的暴露出來
例如:

public class Animal{
      int age;//年齡可能被賦為負數,不符合實際
      int legs;//腿有可能被賦為負數或奇數個,不符合實際
}
所以可以給屬性設置一個get()和set()方法,來添加限制條件,并獲取和設置相應的屬性值,如下:

public class Animal{
      private int age;
      private int legs;
    //對屬性的設置
  publci void setAge(int age){
     if(age>=0){
      this.age=age;
  }
   //對屬性的獲取
  public int getAge() {
    return age;
  }
   //對屬性的設置
  public void setLegs(int leg){
    if(leg>=0&&leg%2==0){
        legs=leg;
    }else{
        legs=0;
    }
 }
  //對屬性的獲取
  public int getLegs(){
    return legs;
  }
}
   但僅這樣還不夠,因為用戶還是可以通過“對象.屬性”的方式更改屬性值,所以,為了避免者中情況發生,要將相應的屬性私有化,只對外留下public方法來供用戶對屬性進行使用。

2.封裝的體現:

(1)將類的屬性私有化,同時提供public方法來獲取和設置此屬性的值
(2)不對外暴露的私有的方法
(3)單例模式(構造器私有化)

3.封裝性的體現,需要權限修飾符(private)的配合

(1)Java的四種權限:
private 缺省 protected public
(2)4種權限可以用來修飾類及類的內部結構(屬性、方法、構造器、內部類)
(3)具體的:4種都可以修飾類的內部結構
修飾類:缺省,public

二、類的繼承性(代碼復用)

1.繼承的作用

(1)減少了代碼的冗余,提高了代碼的復用性
(2)便于功能的擴展
(3)為之后多態性的使用,提供了前提

2.關于繼承的描述

一旦子類繼承了父類。子類就獲取了父類的所有屬性和方法,包括私有private方法或屬性
證明:
私有屬性:通過get()\set(int i)來進行設置和獲取
私有方法:將私有方法放在public方法中還是可以被調用的

3.方法的重寫:

(1)子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同
(2)子類重寫的權限不小于父類(特殊:子類不能重寫private方法)
(3)子類重寫方法拋出的異常類型不大于父類
(4)返回值類型:
a.父類被重寫的方法類型是void,子類重寫也是void
b.父類被重寫的方法類型是A,子類重寫方法可以是A或A的子類
c.父類被重寫的方法類型是基本數據類型,子類重寫方法也是相同的基本數據類型
(5)不能重寫static方法

4.為什么要重寫:

(1)父類的情況不適用于子類
例如:(圓柱體類繼承圓類)圓求面積,但圓柱體求表面積
(2)操作的多樣化

5.方法的重載和重寫

(1)從定義看:
重載(同一個類中,繼承類):方法名相同,形參列表不同,返回值可以不同,權限符可以任意不同
重寫(繼承類):方法名,形參列表相同,返回值,權限符與父類的有關
(2)從編譯和運行的角度
重載(不表現為多態性):允許存在多個同名的方法,編譯器根據方法的不同的參數列表進行區分,對編譯器而言,這些同名方法就成了不同的方法,因此它們的調用地址在編譯期間就確定了
重載:早綁定,靜態綁定
重寫:可以理解為多態,動態綁定,晚綁定,只有在運行時,才知道調用的對象是父類還是子類的
(3)static:重載可以,重寫不行
static 隨著類的加載加載,不能被覆蓋
(4)構造器可以重載不能重寫

6.super關鍵字

(1)調用屬性,方法
a.一般省略
b.子類、父類有同名屬性時,要用super.屬性來指明是調用父類的屬性
c.子類重寫父類方法后,在子類方法中調用父類被重寫的方法時,要用super.方法
(2)調用構造器
super(參數1,參數2,...)

三、類的多態性(運行時行為,只有在運行后才能確定對象)

1.理解:

一個事物的多種形態

2.何為多態性(多態的使用):動態綁定

(1)對象的多態性:(向上轉型)編譯看左(父類),運行看右(子類),調用虛擬方法
①父類引用指向子類對象,當調用子父類同名參數的方法時,實際執行的是子類重寫父類的方法---虛擬方法調用
虛擬方法:在多態的情況下,父類的方法稱為虛擬方法,父類根據賦給它的不同子類對象,
動態調用屬于子類的該方法,這樣的方法在編譯時是不確定的
②如果子類沒有重寫該方法,則執行父類的方法.
③該子類對象不能調用自身的特有方法(編譯會看左邊的父類)

class Animal{
    public void walk(){
       System.out.println("動物跑");
    }
}
class Cat extends Animal {
    @Override
    public void walk() {
        System.out.println("喵喵走路");
    }
public class AnimalTest {
    public static void main(String[] args) {
         Animal cat=new Cat();//父類引用指向子類對象
          cat.walk();//調用walk()方法,執行的是子類重寫的walk方法
     }
}

Java面向對象的封裝、繼承和多態

(2)對象的多態性只適用于方法不適用于屬性,屬性都看左邊的父類

3.多態的使用前提:

(1)類的繼承關系
(2)要有方法的重寫

4.為什么有多態性:

可以通過傳入不同的對象來控制不同的特征結果

5.為什么有了對象的多態性后,子類特有的方法和屬性不能調用

內存中實際上是加載了子類特有的屬性和方法,但是由于變量聲明為父類類型,
導致編譯時,只能調用父類中聲明的屬性和方法,子類特有的屬性和方法不能調用

如何調用子類特有的屬性和方法:

強制類型轉換,(向下轉型)將父類引用指向的對象轉為為子類類型,可能會出現ClassCastException異常,
解決方法:instanceof
(1)a instanceof A:判斷對象a是否是A的實例,如果true就向下轉型

Animal cat=new Cat();
if(cat instanceof Cat){
    Cat cat1=(Cat)cat;
    cat1.eat();
}

(2)如果 a instanceof A:為true,a instanceof B也為true,則B是A的父類

看完上述內容,你們對Java面向對象的封裝、繼承和多態有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

朝阳市| 浙江省| 津市市| 都匀市| 交口县| 淮安市| 华池县| 礼泉县| 叙永县| 体育| 清新县| 宁化县| 闸北区| 伊吾县| 分宜县| 小金县| 酒泉市| 石楼县| 闵行区| 林口县| 厦门市| 新建县| 惠安县| 绍兴县| 芜湖市| 河津市| 新闻| 舟曲县| 丁青县| 昭平县| 扶沟县| 武穴市| 安阳县| 铁岭县| 马龙县| 富裕县| 囊谦县| 潍坊市| 女性| 莲花县| 什邡市|