黑馬程序員全套Java教程_Java基礎(chǔ)入門視頻教程,零基礎(chǔ)小白自學(xué)Java必備

引言:我認(rèn)為,學(xué)習(xí)編程語言,語法是可以通過隨時查找+做練習(xí)鞏固的,學(xué)習(xí)過程中這不是重點,重點是語言和內(nèi)存之間的關(guān)系、使用規(guī)范背后的更底層的邏輯。


類的數(shù)據(jù)類型,
如Scanner sc=new Scanner(System.in);
稱sc為Scannerl類的對象。




包括創(chuàng)建和使用

(1)

(2)




堆內(nèi)存的變量有默認(rèn)初始值,棧內(nèi)存的變量無默認(rèn)初始值

一個類里的成員方法可以調(diào)用這個類和與它有繼承關(guān)系的父類的成員方法:
(1)static的成員方法只能調(diào)用靜態(tài)的成員方法,使用靜態(tài)的成員變量
(2)非static的成員方法調(diào)用成員方法和變量與它們是否static無關(guān)

類中&方法外的是成員變量,
方法里的是局部變量。




調(diào)用set函數(shù)時,因為自己可以修改set()所以可以增加對不合理數(shù)據(jù)的篩選

Student類和StudentDemo標(biāo)準(zhǔn)類


this.在內(nèi)存中的實現(xiàn)原理:
this在哪個對象調(diào)用的成員方法里,this就是哪個對象的地址。(P4)

示例:





String類的構(gòu)造方法(講了4種,推薦第四種直接賦值)



字符串的拼接


字符串的連接用如圖代碼時,由該程序運行時內(nèi)存圖可知:常量池中001、002地址及其空間均被浪費


StringBuilder類的兩個方法:append() reverse()

鏈?zhǔn)皆鲩L

StringBuilder類的reverse、append方法很好用,但String不能用。通過將String轉(zhuǎn)為StringBuilder,使用reverse、append方法后再轉(zhuǎn)換回String就可以實現(xiàn)目的。
(1)構(gòu)造方法StringBuilder(String s)
成員方法 toString()

(2)

(1)字符串的拼接2.0

(2)用StringBuilder與String相互轉(zhuǎn)化完成字符串反轉(zhuǎn)

StringBuilder和String類均有l(wèi)ength()方法

(1)


(2)ArrayList類的方法使用示例

(1)創(chuàng)建ArrayList類的對象array,并將String類的對象存入array:

(2)



(3)


實現(xiàn)學(xué)生管理系統(tǒng):


Alt+ins自動生成構(gòu)造方法、成員方法(get、set)等

繼承:提取共同部分

示例:



繼承的好處&弊端&何時適合使用繼承:


子類:狗;父類:動物
<=> 狗是動物的一種

示例: z.show()方法調(diào)用時使用weight變量,先從z對象所屬的類 Zi 里的成員方法show()里找是否含有局部變量weight, 若沒有從 Zi 里找是否含有成員變量weight,若沒有從 Fu 里找是否含有成員變量weight







(1)繼承的構(gòu)造方法

當(dāng)Fu中無參構(gòu)造方法被注釋掉,Zi類中構(gòu)造方法由于默認(rèn)第一句是:
super() //調(diào)用Fu類無參構(gòu)造方法,故而報錯。
將Zi類構(gòu)造方法方法體第一句均加上:
super(Fu中構(gòu)造方法的參數(shù)的實參)
//通過調(diào)用Fu中含參方法體完成Fu類的初始化




(2)繼承的成員方法




方法重寫

示例:
Phone類里有call()的成員方法。NewPhone類里有call()的成員方法,其中用super訪問Phone類里的call()








案例:
【一】

(2)帶參:
測試類:

注:第5行會報錯,是因為:
一個類中若無構(gòu)造方法,系統(tǒng)會自動給一個無參構(gòu)造方法;
一個類中若有含參構(gòu)造方法,系統(tǒng)不會自動給無參構(gòu)造方法,需要手動寫無參構(gòu)造方法。
改后:

Teacher類(子類):

Person類(父類):

Student類(子類):

【二】


注:
(1)在用途方面:含參構(gòu)造方法==無參構(gòu)造方法+set方法
(2)在兩個子類里要寫上含參和無參構(gòu)造方法,如果已經(jīng)寫好父類,含參構(gòu)造方法也可以根據(jù)父類的成員變量Alt+ins自動生成
Cat類

Dog類

Animal類

測試類




示例:



四種權(quán)限修飾符:

權(quán)限大小(修飾方法時):

示例:

(1)不同包下無繼承關(guān)系的類使用Fu類下的成員方法:

(2)不同包下有繼承關(guān)系的類使用Fu類下的成員方法:

(3)相同包下有繼承關(guān)系的類使用Fu類下的成員方法:

(4)Fu類里使用自己的成員方法:

修飾成員變量時:
private:在測試類調(diào)用用set、get方法,故而需要在類里面添加二方法
public:直接調(diào)用
不加修飾符:默認(rèn),可以直接調(diào)用

final修飾:類、成員方法、局部&成員變量
(1)final修飾父類的成員方法:該方法不能被重寫


(2)final修飾成員變量:該變量無法再被賦值

(3)final修飾類:該類不能做父類


(4)final修飾局部變量


static修飾:成員方法、成員變量
【1】修飾成員變量時:
一個類中定義的靜態(tài)成員變量,在賦值時最佳采用類調(diào)用賦值,被賦值后被該類定義的所有對象共享,在測試類里賦值時用類訪問賦值


【2】修飾成員方法時:
(1)static修飾的成員方法只能調(diào)用靜態(tài)的成員方法,使用靜態(tài)的成員變量
(2)無static修飾的成員方法調(diào)用成員方法和變量與它們是否static無關(guān)(均可使用)
示例:



例:



向上轉(zhuǎn)型(多態(tài))

(1)例:age在Animal類中有,所以通過編譯,weight在Animal類中沒有,所以沒有通過編譯,訪問的是Animal類的成員變量age;
eat( )在Animal類中有,所以通過編譯,playGame( )在Animal類中沒有,所以沒有通過編譯,訪問的是Cat類的成員方法eat()。




給兩個類分別創(chuàng)建一個對象,第一個類里含有一個無參構(gòu)造方法,第二個類含有一個含參構(gòu)造方法且參數(shù)是第一個類的對象
即如:
第一個類:

第二個類:

測試類:

輸出:

解釋:

(2)示例:
左邊有該成員方法==>可以通過編譯
右邊沒有該成員方法==>調(diào)用左邊的




(3)當(dāng)子類有父類沒有的功能時,稱之為特有功能,調(diào)用時無法通過編譯

向下轉(zhuǎn)型:將父類引用強制類型轉(zhuǎn)換為子類對象,可以憑借轉(zhuǎn)換后的對象調(diào)用子類特有成員方法


示例:貓和狗多態(tài)版





抽象方法:只有方法聲明,沒有方法體
用abstract關(guān)鍵字修飾

抽象類里面可以有抽象方法也可以有非抽象方法:

(1)抽象類里面可以沒有抽象方法,但抽象方法一定在抽象類里面
抽象類不是具體的,不能創(chuàng)建對象


在子類里函數(shù)重寫,用多態(tài)都形式創(chuàng)建對象

抽象類的子類要重寫抽象類的所有抽象方法,
否則也是一個抽象類,示例:



抽象類的成員:
(1)成員變量

final修飾(常量)與 final不修飾(變量)的效果和非抽象類一樣


提高了代碼復(fù)用性:是指抽象類用多態(tài)創(chuàng)建對象,多態(tài)用到了繼承,所以提高了代碼復(fù)用性

貓和狗抽象類版本:

抽象類里的抽象方法限定了子類必須完成某些動作(去掉abstract后重寫某些方法)




類implements接口
接口是抽象的不能被實例化,用實現(xiàn)類實例化(也是多態(tài)形式)




抽象類多態(tài)和接口多態(tài)用的多

接口內(nèi)成員變量默認(rèn)被final修飾



(1)接口的成員變量:
不能不初始化,不能修改(因為final),可以用類去調(diào)用(因為static)
【默認(rèn)是public static final類型】

Object()是每一個類的祖宗類,所有類都直接或間接繼承該類

(2)接口無構(gòu)造方法,

super()調(diào)用的其實是Object類的無參構(gòu)造方法

實際上類與接口之間關(guān)系:

(3)接口里只能是抽象方法,因為默認(rèn) public abstract:

默認(rèn) public abstract


【案例】貓與狗

Animal為抽象動物類,要被Cat、Dog類繼承,還要有抽象成員方法eat(),在Cat、Dog類里重寫;

Cat、Dog類繼承Animal類(重寫Animal類里的抽象方法),實現(xiàn)Jumpping接口(重寫接口里的方法);

Jumpping里寫抽象成員方法jump;

Demo類里

接口:
(1)一繼承多

(2)類實現(xiàn)多個接口

接口與抽象類的區(qū)別:
(1)語法區(qū)別:


(2)


分析方法具體類和抽象類:
從具體開始向上分析(向上逐層歸納共同點直至歸一):

具體類:乒乓球運動員、籃球運動員、乒乓球教練、籃球教練
抽象類:運動員、教練、人

實現(xiàn):
先實現(xiàn)接口,再從高到低實現(xiàn)抽象類,最后實現(xiàn)具體類,在Demo里通過具體類的對象調(diào)用方法。
代碼(光給出乒乓球運動員):





類、抽象類、接口作為形參和返回值的問題:
【1】類名作為形參和返回值:




【2】抽象類作為形參和返回值




【3】接口作為形參和返回值

示例:





(1)內(nèi)部類可以直接調(diào)用外部類成員:

//成員:成員變量、構(gòu)造方法、成員方法
(2)外部類調(diào)用內(nèi)部類成員:創(chuàng)建方法,再在方法里創(chuàng)建內(nèi)部類對象,調(diào)用內(nèi)部類成員


【1】成員內(nèi)部類的訪問:
(1)成員內(nèi)部類非私有(不常用):

示例:


(2)之所以把一個類放進(jìn)另一個類里,是不想把它的內(nèi)容隱藏起來不想讓外部看到,其中成員不想被外界直接訪問
------------------------------>修飾符為private:


在外部類建立方法method(),在該方法中創(chuàng)建內(nèi)部類對象,調(diào)用內(nèi)部類方法show(),通過在測試類里調(diào)用外部類對象的method方法調(diào)用show()
【2】



API繼續(xù)學(xué)習(xí):
【1】Math類:
lang包下不需要導(dǎo)包

final修飾:無子類

成員方法和成員變量被static修飾,可以直接用類調(diào)用,無構(gòu)造方法

【2】System
成員方法和成員變量被static修飾,可以直接用類調(diào)用,無構(gòu)造方法