天天看點

day09 多态抽象類接口

多态抽象類接口

      • 1:final關鍵字可以幹什麼?有什麼特點?
      • 2:final關鍵字的面試題?
      • 3:多态是什麼,前提是什麼?
      • 4:多态中成員通路的特點?
      • 5:多态的好處及弊端?如何解決多态的弊端?
      • 6:什麼是向上轉型?什麼是向下轉型?
      • 7:多态練習
      • 8:抽象類概述及其特點?
      • 9:抽象類成員特點?
      • 10:抽象類練習?
      • 11:抽象類的小問題
      • 12:接口的概述及其特點?
      • 13:接口的成員特點?
      • 14:接口的練習
      • 15:抽象類和接口的差別?
      • 16:案例

1:final關鍵字可以幹什麼?有什麼特點?

修飾類、方法、屬性和變量

  • final 修飾類,則該類不允許被繼承,為最終類
  • final 修飾方法,則該方法不允許被覆寫(重寫)
  • final 修飾屬性:則該類的屬性不會進行隐式的初始化(類的初始化屬性必須有值)或在構造方法中指派(但隻能選其一)
  • final 修飾變量,則該變量的值隻能賦一次值,即常量

2:final關鍵字的面試題?

A:修飾局部變量
B:初始化時機
           

a:基本類型 值不能發生改變

b:引用類型 位址值不能發生改變,但是對象的内容是可以改變的

a:隻能初始化一次

b:常見的給值

定義的時候(推薦)

構造方法中

3:多态是什麼,前提是什麼?

  • 允許不同類的對象對同一消息做出響應
  • 同一個對象在不同時刻展現出來的不同狀态

A:有繼承或者實作關系

B:有方法重寫

C:有父類或者父接口引用指向子類對象 (向上轉型)

4:多态中成員通路的特點?

成員變量
成員方法
靜态方法
           

A:成員變量

編譯看左邊,運作看左邊

B:構造方法

子類的構造都會預設通路父類構造

C:成員方法

編譯看左邊,運作看右邊

D:靜态方法

編譯看左邊,運作看左邊

為什麼?

因為成員方法有重寫

5:多态的好處及弊端?如何解決多态的弊端?

多态的好處:

A:提高代碼的維護性(繼承展現)

B:提高代碼的擴充性(多态展現)

多态的弊端:

父不能使用子的特有功能

現象:子可以當作父使用,父不能當作子使用

6:什麼是向上轉型?什麼是向下轉型?

A:向上轉型

從子到父

B:向下轉型

從父到子

強轉符 ()
Man m = (Man)p;

可能ClassCastException異常

使用instanceof在進行向下轉型前判斷
if(p instnceof Man) {
    Man m = (Man)p;
}
           

7:多态練習

class Animal {
    //父類方法
    public void bark() {
        System.out.println("動物叫!");
    }
}
           
class Dog extends Animal {

    //子類重寫父類的bark方法
    public void bark() {
        System.out.println("汪、汪、汪!");
    }
    //子類自己的方法
    public void dogType() {
        System.out.println("這是什麼品種的狗?");
    }
}
           
public class Test {

    public static void main(String[] args) {
        Animal a = new Animal();
        Animal b = new Dog();
        Dog d = new Dog();

        a.bark();
        b.bark();
        //b.dogType();
        //b.dogType()編譯不通過
        d.bark();
        d.dogType();
    }

}	
           

8:抽象類概述及其特點?

在定義類時,前面加上 abstract 關鍵字修飾的類叫抽象類

抽象就是看不懂的

A:抽象類和抽象方法必須用關鍵字abstract修飾

B:抽象類中不一定有抽象方法,但是有抽象方法的類一定是抽象類

C:抽象類不能執行個體化

D:抽象類的子類

a:是一個抽象類

b:是一個具體類這個類必須重寫抽象類中的所有抽象方法

9:抽象類成員特點?

A:成員變量

有變量,有常量

B:構造方法

有構造方法

C:成員方法

有抽象,有非抽象

10:抽象類練習?

// 抽象方法
public abstract class TelePhone {
    public abstract void call();  //抽象方法,打電話
    public abstract void message(); //抽象方法,發短信
}
           
// 建構子類,并實作抽象方法
public class CellPhone extends TelePhone {

    @Override
    public void call() {
        System.out.println("我可以打電話!");
    }

    @Override
    public void message() {
        System.out.println("我可以發短信!");
    }

    public static void main(String[] args) {
        CellPhone cp = new CellPhone();
        cp.call();
        cp.message();
    }

}
           

11:抽象類的小問題

A:一個類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什麼意義?
B:[abstract不能和哪些關鍵字共存](https://blog.csdn.net/qq_29842929/article/details/53536807)
           

可以 不讓建立對象

a:final 沖突

b:private 沖突

c:static 無意義

12:接口的概述及其特點?

接口用于描述類所具有的功能,而不提供功能的實作,

功能的實作需要寫在實作接口的類中,并且該類必須實作接口中所有的未實作方法

A:接口用關鍵字interface修飾

interface 接口名 {}

B:類實作接口用implements修飾

class 類名 implements 接口名 {}

C:接口不能執行個體化

D:接口的實作類

a:是一個抽象類

b:是一個具體類,這個類必須重寫接口中的所有抽象方法

13:接口的成員特點?

A:成員變量

隻能是常量

預設修飾符:public static final

B:構造方法

沒有構造方法

C:成員方法

隻能是抽象的

預設修飾符:public abstract

14:接口的練習

// Cat.java
public class Cat implements Animal{

     public void eat(){
         System.out.println("Cat eats");
     }

     public void travel(){
         System.out.println("Cat travels");
     }
     public static void main(String[] args) {
        Cat cat = new Cat();
        cat.eat();
        cat.travel();
    }
}
           

15:抽象類和接口的差別?

差別

A:成員差別

抽象類:

接口:

B:關系差別:

類與類:

類與接口:

接口與接口:

C:設計理念不同

抽象類:is a,抽象類中定義的是共性功能

接口:like a,接口中定義的是擴充功能

相同:

都不能建立對象

都可以定義抽象方法,并且一定要在子類中重寫

不同:

關鍵字不同abstract interface

抽象方法中既可以有抽象的方法也可以有普通的方法

接口中中所有的方法都是抽象方法

抽象類的方法可以任意權限,接口中方法隻能是public

抽象類隻能單繼承,接口可以多實作

16:案例

[貓狗案例,加入跳高的額外功能](https://blog.csdn.net/dai_ma_dong/article/details/95896248)
[老師和學生案例,加入抽煙的額外功能](https://blog.csdn.net/qq_23973805/article/details/79121017)
[教練和運動員案例(學生分析然後講解)](https://blog.csdn.net/lcn_Lynn/article/details/74989842)