抽象類
抽象類的概述:
動(dòng)物不應(yīng)該定義為具體的東西蝴罪,而且動(dòng)物中的吃钠四,睡等也不應(yīng)該是具體的幔嫂。
我們把一個(gè)不是具體的功能稱為抽象的功能驴党,而一個(gè)類中如果有抽象的功能瘪撇,該類必須是抽象類。
抽象類的特點(diǎn):
A:抽象類和抽象方法必須用abstract關(guān)鍵字修飾
B:抽象類中不一定有抽象方法,但是有抽象方法的類必須定義為抽象類
C:抽象類不能實(shí)例化
因?yàn)樗皇蔷唧w的港庄。
抽象類有構(gòu)造方法倔既,但是不能實(shí)例化?構(gòu)造方法的作用是什么呢?
用于子類訪問父類數(shù)據(jù)的初始化
D :抽象的子類
a:如果不想重寫抽象方法,該子類是一個(gè)抽象類鹏氧。
b:重寫所有的抽象方法渤涌,這個(gè)時(shí)候子類是一個(gè)具體的類。
換句話說把还,如果抽象類的子類不是抽象類实蓬,則需要重寫父類所有的抽象方法。
抽象類的實(shí)例化其實(shí)是靠具體的子類實(shí)現(xiàn)的吊履。是多態(tài)的方式瞳秽。
Animal a = new Cat();
抽象類的成員特點(diǎn):
成員變量:既可以是變量,也可以是常量率翅。
構(gòu)造方法:有。
用于子類訪問父類數(shù)據(jù)的初始化袖迎。
成員方法:既可以是抽象的冕臭,也可以是非抽象的。
抽象類的成員方法特性:
A:抽象方法 強(qiáng)制要求子類做的事情燕锥。
B:非抽象方法 子類繼承的事情辜贵,提高代碼復(fù)用性。
抽象類的抽象方法是不給出具體實(shí)現(xiàn)的归形,以();結(jié)束
接口
接口的特點(diǎn):
A:接口用關(guān)鍵字interface表示
interface 接口名 {}
B:類實(shí)現(xiàn)接口用implements表示
class 類名 implements 接口名 {}
C:接口不能實(shí)例化
那么托慨,接口如何實(shí)例化呢?
按照多態(tài)的方式來實(shí)例化。
D:接口的子類
a:可以是抽象類暇榴。但是意義不大厚棵。
b:可以是具體類蕉世。要重寫接口中的所有抽象方法。(推薦方案)
由此可見:
A:具體類多態(tài)(幾乎沒有)
B:抽象類多態(tài)(常用)
C:接口多態(tài)(最常用)
接口成員特點(diǎn)
成員變量婆硬;只能是常量狠轻,并且是靜態(tài)的。
默認(rèn)修飾符:public static final
建議:自己手動(dòng)給出彬犯。
構(gòu)造方法:接口沒有構(gòu)造方法向楼。
成員方法:只能是抽象方法。
默認(rèn)修飾符:public abstract
建議:自己手動(dòng)給出谐区。
所有的類都默認(rèn)繼承自一個(gè)類:Object湖蜕。
類 Object 是類層次結(jié)構(gòu)的根類。每個(gè)類都使用 Object 作為超類宋列。
classic coding:
interface Inter {
public int num = 10;
public final int num2 = 20;
public static final int num3 = 30;
//錯(cuò)誤: 需要<標(biāo)識(shí)符>
//public Inter() {}
//接口方法不能帶有主體
//public void show() {}
//abstract void show(); //默認(rèn)public
public void show(); //默認(rèn)abstract
}
//接口名+Impl這種格式是接口的實(shí)現(xiàn)類格式
/*
class InterImpl implements Inter {
public InterImpl() {
super();
}
}
*/
class InterImpl extends Object implements Inter {
public InterImpl() {
super();
}
public void show() {}
}
//測試類
class InterfaceDemo2 {
public static void main(String[] args) {
//創(chuàng)建對象
Inter i = new InterImpl();
System.out.println(i.num);
System.out.println(i.num2);
//i.num = 100;
//i.num2 = 200;
//System.out.println(i.num); //無法為最終變量num分配值
//System.out.println(i.num2);//無法為最終變量num2分配值
System.out.println(Inter.num);
System.out.println(Inter.num2);
System.out.println("--------------");
}
}
抽象類和接口的區(qū)別:
A:成員區(qū)別
抽象類:
成員變量:可以變量昭抒,也可以常量
構(gòu)造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:只可以常量
成員方法:只可以抽象
B:關(guān)系區(qū)別
類與類
繼承虚茶,單繼承
類與接口
實(shí)現(xiàn)戈鲁,單實(shí)現(xiàn),多實(shí)現(xiàn)
接口與接口
繼承嘹叫,單繼承婆殿,多繼承
C:設(shè)計(jì)理念區(qū)別
抽象類 被繼承體現(xiàn)的是:”is a”的關(guān)系。抽象類中定義的是該繼承體系的共性功能罩扇。
接口 被實(shí)現(xiàn)體現(xiàn)的是:”like a”的關(guān)系婆芦。接口中定義的是該繼承體系的擴(kuò)展功能。
總結(jié)
1:final關(guān)鍵字(掌握)
(1)是最終的意思喂饥,可以修飾類消约,方法,變量员帮。
(2)特點(diǎn):
A:它修飾的類或粮,不能被繼承。
B:它修飾的方法捞高,不能被重寫氯材。
C:它修飾的變量,是一個(gè)常量硝岗。
(3)面試相關(guān):
A:局部變量
a:基本類型 值不能發(fā)生改變
b:引用類型 地址值不能發(fā)生改變氢哮,但是對象的內(nèi)容是可以改變的
B:初始化時(shí)機(jī)
a:只能初始化一次。
b:常見的給值
定義的時(shí)候型檀。(推薦)
構(gòu)造方法中冗尤。
2:多態(tài)(掌握)
(1)同一個(gè)對象在不同時(shí)刻體現(xiàn)出來的不同狀態(tài)。
(2)多態(tài)的前提:
A:有繼承或者實(shí)現(xiàn)關(guān)系。
B:有方法重寫裂七。
C:有父類或者父接口引用指向子類對象皆看。
多態(tài)的分類:
a:具體類多態(tài)
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象類多態(tài)
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多態(tài)
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
(3)多態(tài)中的成員訪問特點(diǎn)
A:成員變量
編譯看左邊,運(yùn)行看左邊
B:構(gòu)造方法
子類的構(gòu)造都會(huì)默認(rèn)訪問父類構(gòu)造
C:成員方法
編譯看左邊碍讯,運(yùn)行看右邊
D:靜態(tài)方法
編譯看左邊悬蔽,運(yùn)行看左邊
為什么?
因?yàn)槌蓡T方法有重寫。
(4)多態(tài)的好處:
A:提高代碼的維護(hù)性(繼承體現(xiàn))
B:提高代碼的擴(kuò)展性(多態(tài)體現(xiàn))
(5)多態(tài)的弊端:
父不能使用子的特有功能捉兴。
現(xiàn)象:
子可以當(dāng)作父使用蝎困,父不能當(dāng)作子使用。
(6)多態(tài)中的轉(zhuǎn)型
A:向上轉(zhuǎn)型
從子到父
B:向下轉(zhuǎn)型
從父到子
(7)孔子裝爹的案例幫助大家理解多態(tài)
(8)多態(tài)的練習(xí)
A:貓狗案例
B:老師和學(xué)生案例
3:抽象類(掌握)
(1)把多個(gè)共性的東西提取到一個(gè)類中倍啥,這是繼承的做法禾乘。
但是呢,這多個(gè)共性的東西虽缕,在有些時(shí)候始藕,方法聲明一樣,但是方法體氮趋。
也就是說伍派,方法聲明一樣,但是每個(gè)具體的對象在具體實(shí)現(xiàn)的時(shí)候內(nèi)容不一樣剩胁。
所以诉植,我們在定義這些共性的方法的時(shí)候,就不能給出具體的方法體昵观。
而一個(gè)沒有具體的方法體的方法是抽象的方法晾腔。
在一個(gè)類中如果有抽象方法,該類必須定義為抽象類啊犬。
(2)抽象類的特點(diǎn)
A:抽象類和抽象方法必須用關(guān)鍵字abstract修飾
B:抽象類中不一定有抽象方法,但是有抽象方法的類一定是抽象類
C:抽象類不能實(shí)例化
D:抽象類的子類
a:是一個(gè)抽象類灼擂。
b:是一個(gè)具體類。這個(gè)類必須重寫抽象類中的所有抽象方法觉至。
(3)抽象類的成員特點(diǎn):
A:成員變量
有變量剔应,有常量
B:構(gòu)造方法
有構(gòu)造方法
C:成員方法
有抽象,有非抽象
(4)抽象類的練習(xí)
A:貓狗案例練習(xí)
B:老師案例練習(xí)
C:學(xué)生案例練習(xí)
D:員工案例練習(xí)
(5)抽象類的幾個(gè)小問題
A:抽象類有構(gòu)造方法语御,不能實(shí)例化峻贮,那么構(gòu)造方法有什么用?
用于子類訪問父類數(shù)據(jù)的初始化
B:一個(gè)類如果沒有抽象方法,卻定義為了抽象類,有什么用?
為了不讓創(chuàng)建對象
C:abstract不能和哪些關(guān)鍵字共存
a:final 沖突
b:private 沖突
c:static 無意義
4:接口(掌握)
(1)回顧貓狗案例沃暗,它們僅僅提供一些基本功能。
比如:貓鉆火圈何恶,狗跳高等功能孽锥,不是動(dòng)物本身就具備的,
是在后面的培養(yǎng)中訓(xùn)練出來的,這種額外的功能惜辑,java提供了接口表示唬涧。
(2)接口的特點(diǎn):
A:接口用關(guān)鍵字interface修飾
interface 接口名 {}
B:類實(shí)現(xiàn)接口用implements修飾
class 類名 implements 接口名 {}
C:接口不能實(shí)例化
D:接口的實(shí)現(xiàn)類
a:是一個(gè)抽象類。
b:是一個(gè)具體類盛撑,這個(gè)類必須重寫接口中的所有抽象方法碎节。
(3)接口的成員特點(diǎn):
A:成員變量
只能是常量
默認(rèn)修飾符:public static final
B:構(gòu)造方法
沒有構(gòu)造方法
C:成員方法
只能是抽象的
默認(rèn)修飾符:public abstract
(4)類與類,類與接口,接口與接口
A:類與類
繼承關(guān)系,只能單繼承抵卫,可以多層繼承
B:類與接口
實(shí)現(xiàn)關(guān)系狮荔,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)介粘。
還可以在繼承一個(gè)類的同時(shí)殖氏,實(shí)現(xiàn)多個(gè)接口
C:接口與接口
繼承關(guān)系,可以單繼承姻采,也可以多繼承
(5)抽象類和接口的區(qū)別(自己補(bǔ)齊)?
A:成員區(qū)別
抽象類:
接口:
B:關(guān)系區(qū)別:
類與類:
類與接口:
接口與接口:
C:設(shè)計(jì)理念不同
抽象類:is a雅采,抽象類中定義的是共性功能。
接口:like a慨亲,接口中定義的是擴(kuò)展功能婚瓜。
(6)練習(xí):
A:貓狗案例,加入跳高功能
B:老師和學(xué)生案例刑棵,加入抽煙功能0