一.三大特征:
1.封裝: 把數(shù)據(jù)封裝起來,不讓外面隨便訪問
2,繼承: 子類繼承父類,有共同點(diǎn)
3.多態(tài): 事物存在的多種形態(tài)
public 公共的,所有類都可以訪問;
private 私有的,只有本類可以訪問
protected 同一包,當(dāng)前類,子孫類可以訪問
default 同一個(gè)包內(nèi),本類可以訪問
不同包調(diào)用,要導(dǎo)包
private 私有屬性,要set,get方法
this.? 當(dāng)前的實(shí)例
3.final
final 加到變量上,就成為常量;不能修改
final 加到方法前,這個(gè)方法不能被子類覆蓋(不能重寫)
final 加到類前,表示這個(gè)類不能被繼承
二. 繼承
1.* A:this和super都代表什么
* this:代表當(dāng)前對(duì)象的引用,誰來調(diào)用我,我就代表誰
* super:代表當(dāng)前對(duì)象父類的引用
* B:this和super的使用區(qū)別
* a:調(diào)用成員變量
*this.成員變量 調(diào)用本類的成員變量,本類沒有也可以調(diào)用父類的成員變量
* super.成員變量 調(diào)用父類的成員變量
* b:調(diào)用構(gòu)造方法
* this(...) 調(diào)用本類的構(gòu)造方法
* super(...) 調(diào)用父類的構(gòu)造方法
* c:調(diào)用成員方法
* this.成員方法 調(diào)用本類的成員方法,也可以調(diào)用父類的方法
* super.成員方法 調(diào)用父類的成員方法
2.重載和重寫的區(qū)別
* A:方法重寫注意事項(xiàng)
* a:父類中私有方法不能被重寫
* 因?yàn)楦割愃接蟹椒ㄗ宇惛揪蜔o法繼承,既然子類無法繼承,就談不上重寫了
* b:子類重寫父類方法時(shí)吊履,訪問權(quán)限不能更低
* 最好就一致
* c:父類靜態(tài)方法苇羡,子類也必須通過靜態(tài)方法進(jìn)行重寫
* 子類重寫父類方法的時(shí)候程奠,最好聲明一模一樣计寇。
* Override和Overload的區(qū)別?Overload能改變返回值類型嗎?
* overload可以改變返回值類型,只看參數(shù)列表
* 方法重寫:子類中出現(xiàn)了和父類中方法聲明一模一樣的方法檀葛。與返回值類型有關(guān),返回值是一致(或者是子父類)的
* 方法重載:本類中出現(xiàn)的方法名一樣麦备,參數(shù)列表不同的方法伊滋。與返回值類型無關(guān)洋幻。
* 子類對(duì)象調(diào)用方法的時(shí)候:
* 先找子類本身郁轻,再找父類。
2.靜態(tài)優(yōu)先于非靜態(tài),父類優(yōu)先于子類,構(gòu)造代碼塊優(yōu)先于構(gòu)造方法
三.多態(tài)
* A:多態(tài)(polymorphic[,p?l?'m??f?k])概述
* 事物存在的多種形態(tài)
* B:多態(tài)前提
* a:要有繼承關(guān)系。
* b:要有方法重寫好唯。
* c:要有父類引用指向子類對(duì)象竭沫。father f = new son();? ? ///////向上轉(zhuǎn)型
1.多態(tài)中的成員訪問特點(diǎn)之成員變量
成員變量
編譯看左邊(父類),運(yùn)行看左邊(父類)
成員方法
編譯看左邊(父類),運(yùn)行看右邊(子類)骑篙。///////////////動(dòng)態(tài)綁定
靜態(tài)方法
編譯看左邊(父類)蜕提,運(yùn)行看左邊(父類)。
(靜態(tài)和類相關(guān)靶端,算不上重寫谎势,所以,訪問還是左邊的)
只有非靜態(tài)的成員方法,編譯看左邊,運(yùn)行看右邊
2.instanceof? ? 判斷前面這個(gè)對(duì)象是否屬于后面這個(gè)類
```
if (animal instanceof Dog) {
System.out.println("這是一條狗");
Dog d = (Dog)animal;
d.bite();
}else if (animal instanceof Cat) {
System.out.println("這是一只貓");
Cat c = (Cat)animal;
c.bite();
}
```
3.static關(guān)鍵字
(1)被static關(guān)鍵字修飾的成員杨名,屬于該類中所有對(duì)象的共享內(nèi)容可以直接用類名調(diào)用脏榆,也可以用對(duì)象調(diào)用,但是建議用類名調(diào)用
(2)隨著類的加載而加載,優(yōu)先于對(duì)象存在:隨著字節(jié)碼文件的加載而加載的台谍,那時(shí)候還沒有對(duì)象呢
(3)靜態(tài)修飾的內(nèi)容一般我們稱其為:與類相關(guān)的须喂,類成員(靜態(tài)變量:類變量,靜態(tài)方法:類方法)
(4)在靜態(tài)方法中是沒有this關(guān)鍵字的(因?yàn)閠his指的是一個(gè)具體的對(duì)象,而靜態(tài)在加載到內(nèi)存時(shí)還沒有具體的對(duì)象)
(5)靜態(tài)方法只能訪問靜態(tài)的成員變量和靜態(tài)的成員方法,非靜態(tài)的成員方法既可以方法靜態(tài)的成員方法和成員變量趁蕊,又能訪問非靜態(tài)的成員方法和成員變量
簡(jiǎn)單記憶:靜態(tài)不能訪問非靜態(tài)
4.組合是 has a 的關(guān)系,繼承是is a的關(guān)系(我有一條狗,,,,,,,,,狗繼承動(dòng)物)
優(yōu)先使用組合,因?yàn)樗`活
繼承盡量不要超過三層
5.abstract 關(guān)鍵字
* A:抽象類概述
* 抽象就是看不懂的?,不能被實(shí)例化
* B:抽象類特點(diǎn)
* a:抽象類和抽象方法必須用abstract關(guān)鍵字修飾
* abstract class 類名 {}
* public abstract void eat();//當(dāng)不知道該方法具體是怎么實(shí)現(xiàn)的
//比如動(dòng)物吃坞生,你知道它吃什么嗎?怎么吃掷伙?都不知道
* b:抽象類不一定有抽象方法是己,有抽象方法的類一定是抽象類或者是接口
* c:抽象類不能實(shí)例化那么,抽象類如何實(shí)例化呢?
* 按照多態(tài)的方式任柜,由具體的子類實(shí)例化卒废。其實(shí)這也是多態(tài)的一種,抽象類多態(tài)乘盼。
* d:抽象類的子類
* 要么是抽象類
* 要么重寫抽象類中的所有抽象方法
* A:抽象類的成員特點(diǎn)
* a:成員變量:既可以是變量升熊,也可以是常量。abstract是否可以修飾成員變量?不能修飾成員變量
* b:構(gòu)造方法:有绸栅。
* 用于子類訪問父類數(shù)據(jù)的初始化级野。
* c:成員方法:既可以是抽象的,也可以是非抽象的粹胯。
* B:抽象類的成員方法特性:
*a:抽象方法 強(qiáng)制要求子類做的事情蓖柔。/////子類必須實(shí)現(xiàn)
publicabstractvoidmethod();//? 抽象方法只要定義就行,不要具體的實(shí)現(xiàn)
* b:非抽象方法 子類繼承的事情,提高代碼復(fù)用性风纠。////子類可以直接使用
接口的方法都是抽象的
1.接口
接口特點(diǎn)
* a:接口用關(guān)鍵字interface表示
* interface 接口名 {}
* b:類實(shí)現(xiàn)接口用implements表示
* class 類名 implements 接口名 {}
* c:接口不能實(shí)例化
* 那么况鸣,接口如何實(shí)例化呢?
* 按照多態(tài)的方式來實(shí)例化。
* d:接口的子類
* a:可以是抽象類竹观。但是意義不大镐捧。
* b:可以是具體類潜索。要重寫接口中的所有抽象方法。(推薦方案)
接口與類相似點(diǎn):
一個(gè)接口可以有多個(gè)方法懂酱。
接口文件保存在.java結(jié)尾的文件中竹习,文件名使用接口名。
接口的字節(jié)碼文件保存在.class結(jié)尾的文件中列牺。
接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中整陌。
接口與類的區(qū)別:
接口不能用于實(shí)例化對(duì)象。
接口沒有構(gòu)造方法瞎领。
接口中所有的方法必須是抽象方法泌辫。
接口不能包含成員變量,除了static和final變量九默。
接口不是被類繼承了震放,而是要被類實(shí)現(xiàn)。
接口支持多重繼承驼修。
*A:接口成員特點(diǎn)
*成員變量只能是常量澜搅,并且是靜態(tài)的并公共的。
* 默認(rèn)修飾符:public static final
* 建議:自己手動(dòng)給出邪锌。
* 構(gòu)造方法:接口沒有構(gòu)造方法。
* 成員方法:只能是抽象方法癌瘾。//////接口的方法都是抽象的
* 默認(rèn)修飾符:public abstract
* 建議:自己手動(dòng)給出觅丰。
3.defualt關(guān)鍵字
```
default void report() { //加defalut 可以聲明方法
System.out.println("匯報(bào)相關(guān)數(shù)據(jù)");
}
```
2.內(nèi)部類
內(nèi)部類訪問特點(diǎn)
* a:內(nèi)部類可以直接訪問外部類的成員,包括私有妨退。
* b:外部類要訪問內(nèi)部類的成員妇萄,必須創(chuàng)建對(duì)象。
* 外部類名.內(nèi)部類名 對(duì)象名 = 外部類對(duì)象.內(nèi)部類對(duì)象;
out.int oi - new out().new int();
oi.方法();
3.靜態(tài)成員內(nèi)部類
* static
* B:成員內(nèi)部類被靜態(tài)修飾后的訪問方式是:
* 外部類名.內(nèi)部類名 對(duì)象名 = 外部類名.內(nèi)部類對(duì)象;
Outer.Inneroi=newOuter.Inner();
//外部類是一個(gè)普通類,但是內(nèi)部類是一個(gè)靜態(tài)類,那么一個(gè)普通類訪問靜態(tài)成員時(shí)可以用類名.的方式,
4.(成員內(nèi)部類私有使用)
* private:在外部不能直接創(chuàng)建內(nèi)部類對(duì)象了
5.局部?jī)?nèi)部類:(外部類里面方法里的類)
3.匿名內(nèi)部類;
* A:匿名內(nèi)部類
* 就是內(nèi)部類的簡(jiǎn)化寫法咬荷。
* B:前提:存在一個(gè)類或者接口
* 這里的類可以是具體類也可以是抽象類冠句。
* C:格式:
*
new 類名或者接口名(){
重寫方法;
}
* D:本質(zhì)是什么呢?------------局部?jī)?nèi)部類
*是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象。