1. 程式人生 > >我的學習之路_第二章_接口/多態

我的學習之路_第二章_接口/多態

nal interface implement 類型轉換 ace pri 類名 提高 表現

接口
(1)當抽象類中的方法都是抽象的時候,java就提供了一種新的表現形式:接口。接口是功能的集合 接口不能創建對象
(2)格式:
父接口:
public interface Inter
{

}

子類:
public class InterImpl implements Inter
{

}
(3)接口的特點:
A:不需要被abstract修飾。
B:類實現接口,可以單實現,還可以多實現。
C:接口可以繼承接口,可以單繼承,也可以多繼承。
D:接口與父類的功能可以重復,均代表要具備某種功能。
(4)抽象類和接口的區別:
A:成員的區別
抽象類:
成員變量:可以是變量,也可以是常量。
構造方法:有構造方法,用於子類實例化使用。
成員方法:可以是抽象的,也可以是非抽象的。

接口:
成員變量:只能是常量。
默認修飾符:public static final
成員方法:只能是抽象的。
默認修飾符:public abstract

推薦:默認修飾符請自己永遠手動給出。

B:類和接口的關系區別
類與類:
繼承關系,只能單繼承。可以多層繼承。

類與接口:
實現關系,可以單實現,也可以多實現。
類還可以在繼承一個類的同時實現多個接口。

接口與接口:
繼承關系,可以單繼承,也可以多繼承。

C:體現的理念不同
抽象類裏面定義的都是一個繼承體系中的共性內容。

接口是功能的集合,是一個體系額外的功能,是暴露出來的規則。

多態
(1)同一個對象,在不同時刻表現出來的不同狀態。
舉例:水(水,冰,水蒸氣)
貓(貓,動物)

(2)前提:
A:有繼承或者實現關系。
B:有方法的重寫。
C:有父類(接口)的引用指向子類對象。
(3)多態中的成員使用特點:
Fu fz = new Zi();
多態時,所有表現形式都是父類的表現形式,
只有調用方法時,運行的是子類重寫的方法
A:成員變量
編譯看左邊,運行看左邊。
B:成員方法
編譯看左邊,運行看右邊。

class Fu {
int num=4;
void show() {
System.out.println("showFu");
}
}
class Zi extends Fu {
int num=5;
void show() {
System.out.println("showZi");
}
}
class T {
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.num);
f.show();

}

(4)多態中的轉型:
A:向上轉型
把子類對象賦值給父類(接口)的引用 自動類型提升 int a = 0; double b =a;

Fu fz = new Zi();
B:向下轉型
把父類(接口)的引用強制轉換成子類對象
double b = 10.0;
int a = (int)b;

Fu fz = new Zi();
Zi zf = (Zi)fz;

註意:Fu fu = new Fu() 不能向下轉型 會報ClassCastException 類型轉換異常


(5)多態的好處及弊端:
A:好處
提高了程序可維護下和可擴展性。

B:弊端
不能使用子類特有內容。
要想使用,要麽向下轉型,要麽重新創建子類對象。
(6)多態的三種形式:
A:具體的類多態 父類 變量名 = new 子類();
B:抽象類多態 父抽象類 變量名 = new 子類();
C:接口多態 接口 變量名 = new 實現類();
instanceof 關鍵字
格式: 對象名 instanceof 類名
返回值: true, false
作用: 判斷指定的對象 是否為 給定類創建的對象

Animal a1 = new Cat();

Animal a2 = new Dog();

method(a1)


public static void method(Animal a){
if(a instanceof Cat){
向下轉型
調用貓特有方法
}

}


我的學習之路_第二章_接口/多態