1 多態(tài)

1.1 多態(tài)概述

同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來(lái)的不同形態(tài)

  • 舉例: 貓

    • 我們可以說(shuō)貓是貓: 貓 cat = new 貓();
    • 我們也可以說(shuō)貓是動(dòng)物: 動(dòng)物 animal = new 貓();
    • 這里貓?jiān)诓煌臅r(shí)刻表現(xiàn)出來(lái)了不同的形態(tài),這就是多態(tài)
  • 多態(tài)的前提和體現(xiàn)
    • 有繼承/實(shí)現(xiàn)關(guān)系
    • 有方法重寫
    • 有父類引用指向子類對(duì)象

1.2 多態(tài)中成員訪問特點(diǎn)

成員變量: 編譯看左邊,執(zhí)行看左邊
成員方法: 編譯看左邊,執(zhí)行看右邊

  • 為什么成員變量和成員方法的訪問不一樣呢?
    • 因?yàn)槌蓡T方法有重寫,而成員變量沒有

1.3 多態(tài)的好處和弊端

  • 多態(tài)的好處: 提高了程序的擴(kuò)展性

  • 多態(tài)的弊端: 不能使用子類的特有功能

  • 具體體現(xiàn): 定義方法的時(shí)候,使用父類型作為參數(shù),將來(lái)在使用的時(shí)候,使用具體的子類型參與操作

1.4 多態(tài)中的轉(zhuǎn)型

  1. 向上轉(zhuǎn)型
    • 從子到父
    • 父類引用指向子類對(duì)象
  2. 向下轉(zhuǎn)型
    • 從父到子
    • 父類引用轉(zhuǎn)為子類對(duì)象

2 抽象類

2.1 抽象類概述

在Java中,一個(gè)==沒有方法體==的方法應(yīng)該定義為==抽象方法==,而類中如果有==抽象方法==,該類必須定義為==抽象類==

2.2 抽象類的特點(diǎn)

抽象類和抽象方法必須使用abstract關(guān)鍵字修飾

public abstract class 類名 {}public abstract void eat();
  • 抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
  • 抽象類不能實(shí)例化
    • 抽象類如何實(shí)例化呢?
    • 參照多態(tài)的方式,通過子類對(duì)象實(shí)例化,這叫抽象類多態(tài)
  • 抽象類的子類
    • 要么重寫抽象類中的所有抽象方法
    • 要么是抽象類

2.3 抽象類的成員特點(diǎn)

  1. 成員變量
    • 可以是變量
    • 也可以是常量
  2. 構(gòu)造方法
    • 有構(gòu)造方法,但是不能實(shí)例化
    • 那么,構(gòu)造方法的作用是什么呢? 用于子類訪問父類數(shù)據(jù)的初始化
  3. 成員方法
    • 可以有抽象方法: 限定子類必須完成某些動(dòng)作
    • 也可以有非抽象方法: 提高代碼復(fù)用性

3 接口

3.1 接口概述

接口就是一種==公共的規(guī)范標(biāo)準(zhǔn)==,只要符合規(guī)范標(biāo)準(zhǔn),大家都可以通用
Java中的接口更多的體現(xiàn)在==對(duì)行為的抽象==

3.2 接口的特點(diǎn)

  • 接口用關(guān)鍵字interface修飾

    • public interface 接口名 {}
  • 類實(shí)現(xiàn)接口用implements表示

    • public class 類名 implements 接口名 {}
  • 接口不能實(shí)例化

    • 接口如何實(shí)例化呢? 參照多態(tài)的方式,通過實(shí)現(xiàn)類對(duì)象實(shí)例化,這叫接口多態(tài)

    • 多態(tài)的形式: 具體類多態(tài),抽象類多態(tài),接口多態(tài)

    • 多態(tài)的前提: 有繼承或者實(shí)現(xiàn)關(guān)系、有方法重寫、有父(類/接口)引用指向(子/實(shí)現(xiàn))類對(duì)象
  • 接口的實(shí)現(xiàn)類

    • 要么重寫接口中的所有抽象方法

    • 要么是抽象類

3.3 接口的成員特點(diǎn)

  1. 成員變量
    • 只能是常量
    • 默認(rèn)修飾符: public static final
  2. 構(gòu)造方法
    • 接口沒有構(gòu)造方法,因?yàn)榻涌谥饕菍?duì)行為進(jìn)行抽象的,是沒有具體存在
    • 一個(gè)類如果沒有父類,默認(rèn)繼承自O(shè)bject類
  3. 成員方法
    • 只能是抽象方法
    • 默認(rèn)修飾符: public abstract
    • 關(guān)于接口中的方法,JDK8和JDK9中有一些新特性,后面再講解

3.4 類和接口的關(guān)系

  1. 類和類的關(guān)系
    • 繼承關(guān)系,只能單繼承,但是可以多層繼承
  2. 類和接口的關(guān)系
    • 實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn),還可以在繼承一個(gè)類的同時(shí)實(shí)現(xiàn)多個(gè)接口
  3. 接口和接口的關(guān)系
    • 繼承關(guān)系,可以單繼承,也可以多繼承

3.5 抽象類和接口的區(qū)別

  1. 成員區(qū)別

    • 抽象類

      變量, 常量; 有構(gòu)造方法; 有抽象方法, 也有非抽象方法

    • 接口
      常量; 抽象方法
  2. 關(guān)系區(qū)別

    • 類與類
      繼承,單繼承
    • 類與接口
      實(shí)現(xiàn),可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)
    • 接口與接口
      繼承,單繼承,多繼承
  3. 設(shè)計(jì)理念區(qū)別

    • 抽象類

      對(duì)類抽象,包括屬性、行為

    • 接口
      對(duì)行為抽象,主要是行為