Java面向?qū)ο笠曨l教程全集-璇女神主講【課工場】

循環(huán)(do while )

這里的空指針異常是因?yàn)槲覄?chuàng)建了一個新的數(shù)組,也規(guī)定了這個數(shù)組的長度,但是數(shù)組里面的每個下標(biāo)我都沒有放進(jìn)去對象,然后就對著空對象進(jìn)行直接的屬性改變/雖然系統(tǒng)不報錯,但是運(yùn)行的時候就會有錯誤,以后遇到這種情況必須要先給數(shù)組創(chuàng)建對象
方法的命名要遵循駝峰命名規(guī)則(首個單詞小寫,之后每個單詞的首字母都大寫)
構(gòu)造方法沒有返回值。構(gòu)造方法名字和類名一樣
構(gòu)造方法類似與給創(chuàng)建的元素進(jìn)行初始化。
系統(tǒng)默認(rèn)提供無參(所以我們創(chuàng)建對象的時候可以直接調(diào)用無參的構(gòu)造方法)
但是如果我們自定義了有參的構(gòu)造方法,系統(tǒng)就不在再默認(rèn)提供無參構(gòu)造方法!
Student stu = new Student();
這里 就是調(diào)用了無參構(gòu)造方法
創(chuàng)建帶參的構(gòu)造方法就是給元素的進(jìn)行初始化
public class Student{
String name;
int age;
}
public class Student(String name,int age){
this.name = name;
this.age = age; / / 這里就引申出了this的用法
}
this是對一個對象的默認(rèn)引用
可以調(diào)用本類的屬性 this.age=age;
可以調(diào)用本類的普通方法 this.add();
可以調(diào)用本類的構(gòu)造方法 this(name);
(this調(diào)用本類的構(gòu)造方法,必須是寫在第一行)
public class Student(String name,int age){
this.name = name;
this.age = age;
}
//調(diào)用本類構(gòu)造方法
public class Student(String name,int age, int score){
this.(name.this ); //語法注意:使用this必須是構(gòu)造方法的第一個語句
//調(diào)用構(gòu)造方法Student(String name,int age)
this.score=score;
}
方法重載(同名不同參)
同一個類中,方法名相同,參數(shù)個數(shù)或者類型不同,與返回值和訪問修飾符無關(guān)
成員變量和局部變量
作用域不同:
屬性:成員變量(全局變量)
局部變量:作用域是一個方法或者一個語句塊
初始值不同:
JAVA會給成員變量一個初始值
java不會給局部變量一個初始值,局部變量必須初始化賦值以后使用
(同一個類中,成員變量和局部變量同名時,局部變量具有更高的優(yōu)先級)
帶參方法如何定義和使用?
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型在參數(shù)傳遞時的區(qū)別是什么?
構(gòu)造方法有何作用?如何定義?
方法重載有何特點(diǎn)?
成員變量和局部變量的區(qū)別?
封裝與繼承
何為封裝:把類的某些信息隱藏起來,不允許外部程序直接訪問,而是通過該類提供的方法來實(shí)現(xiàn)對隱藏信息的操作和訪問。屬性私有,方法公開。
兩大原則:1.把所有屬性藏起來
2.把盡可能多的東西藏起來,對外提供便捷的接口。
如何實(shí)現(xiàn)封裝:
1.修改屬性的可見性:設(shè)為private,防止錯誤的修改
2.創(chuàng)建共有的getter/setter方法(getter是屬性的讀取/setter是屬性的賦值和操作)
3.在getter/setter加入屬性控制語句
封裝的好處:
1.便于使用者正確使用系統(tǒng),防止程序修改屬性
2.有助于系統(tǒng)之間的松耦合,提高系統(tǒng)獨(dú)立性
3.提高軟件的可重用性
4.降低了構(gòu)建大型項(xiàng)目的風(fēng)險
包
1.包名由小寫字母組成,不能以圓點(diǎn)開頭或結(jié)尾
2.包名之前最好加上唯一的前綴,通常使用組織倒置的網(wǎng)絡(luò)
3.包名后續(xù)部分依不同機(jī)構(gòu)內(nèi)部規(guī)范而不同
書寫規(guī)范:
package只能有一句(必須放在第一句)
import可以有多句
緊接著是類的聲明
訪問權(quán)限控制修飾符:
同包的測試類及可以訪問public修飾的類,也可以訪問默認(rèn)修飾符修飾的類
不同包的測試類及只可以訪問public修飾的類,不可以訪問默認(rèn)修飾符修飾的類
public:公有訪問級別
默認(rèn)修飾符:包級私有訪問級別
類的訪問修飾符有兩種
類成員的訪問修飾符由四種
作用域??當(dāng)前類 同一package 子孫類????其他
public? ?√?? ?? ?√????? √??? √?
protected ?√ ?? ?√???? √?? ×?
friendly默認(rèn) √? ?? ?√???? ? ×??? ×?
private?? √?? ?? ?×???? ×?? ×?
static修飾符可以修飾:
*成員變量
靜態(tài)變量,可以直接通過類名訪問
*成員方法
靜態(tài)方法,可以直接通過類名訪問
*代碼塊
靜態(tài)代碼塊,當(dāng)Java虛擬機(jī)加載類時,就會執(zhí)行該代碼塊(只調(diào)用一次)
繼承
類圖中的三角符號代表繼承

子類和父類滿足 is-a 的關(guān)系才能使用繼承.繼承是實(shí)現(xiàn)代碼重用的重要手段之一,java中只支持單根繼承
子類無法繼承父類的private成員
同包的子類父類默認(rèn)修飾符可以訪問,不同包則不可以
子類可以繼承父類的protected成員,不管是不是同包
子類繼承了包的public,protected修飾的屬性和方法(不管是否同包)。繼承了默認(rèn)訪問修飾符修飾的屬性和方法(必須同包)。
編寫父類:
【訪問修飾符】class Pet{
//公共的屬性和方法
}
編寫子類:
【訪問修飾符】class Dog extends Pet{
//子類特有的屬性和方法
}
實(shí)現(xiàn)封裝的步驟是什么?
如何床架和引用包?
常用的訪問權(quán)限控制符有哪些?
static在java中的應(yīng)用場景以及使用注意事項(xiàng)是什么?
繼承有何好處?
如何實(shí)現(xiàn)繼承?
子類能(不能)繼承父類的什么?
方法重寫和多態(tài)
父類:提供共性方法
方法的重寫或者方法的覆蓋 (overriding)
子類根據(jù)需求對父類繼承的方法進(jìn)行重新編寫
重寫是,可以用super.的方式來保留父類的方法
構(gòu)造方法不可以被重寫
super介紹(super訪問父類成員)
訪問父類方法 super.print();
訪問父類屬性 super.name;
訪問父類構(gòu)造方法 super(); super(name,health,love);
使用super關(guān)鍵句字,super代表父類對象
super只能出現(xiàn)在子類的方法和構(gòu)造方法中
super使用構(gòu)造方法時,只能放在第一句
super不可以調(diào)用父類的private屬性
調(diào)用父類的父類就用super就好
super使用場景:
子類調(diào)用父類方法
可以使用super調(diào)用子類覆蓋掉的父類的同名成員

繼承條件下構(gòu)造方法的調(diào)用規(guī)則:
*子類構(gòu)造方法沒有通過super顯式調(diào)用父類的有參構(gòu)造方法,也沒有通過this顯式調(diào)用自身的其他構(gòu)造方法:系統(tǒng)默認(rèn)調(diào)用父類的無參構(gòu)造方法
*子類構(gòu)造方法通過super顯式調(diào)用父類的有參構(gòu)造方法:執(zhí)行父類相應(yīng)的構(gòu)造方法,而不執(zhí)行父類的無參構(gòu)造方法
*子類構(gòu)造方法通過this顯式調(diào)用自身的其他構(gòu)造方法,在相應(yīng)構(gòu)造方法中應(yīng)用以上兩條規(guī)則
方法重寫規(guī)則:
*方法名相同
*參數(shù)類型相同
*返回值類型相同或者是其子類
*訪問權(quán)限不可以嚴(yán)于父類
*父類的靜態(tài)方法不能被子類覆蓋為非靜態(tài)方法,谷類的非靜態(tài)方法不能被子類覆蓋為靜態(tài)方法
*子類可以定義與父類同名的靜態(tài)方法,以便在子類中隱藏父類的靜態(tài)方法(靜態(tài)方法無法使用super)
*不能拋出比父類方法更多的異常
靜態(tài)方法可以直接通過類名去調(diào)用。

方法重載是同一類中同名不同參
方法重寫是父子類中同名同參
Object類
是所有類的直接或者間接父類

Object類的equals()方法
比較兩個對象是否為同一個對象,是則返回true
操作符:==
簡單數(shù)據(jù)類型,直接比較值:如1==2
在Object類的equals方法與==沒有區(qū)別
比較兩者(引用類型)是否為同一對象:==或equals都可以判斷
重寫Object類的方法
重寫equals方法原因是:當(dāng)有特殊需求的時候,比如在實(shí)際生活應(yīng)用當(dāng)中,認(rèn)為屬性相同就是同一對象時,就需要重寫equals方法
重寫方法的快捷操作:Alt+Shift+s調(diào)出界面


可以重寫的父類方法

instanceof運(yùn)算符:用來判斷某個對象是否為某種類型--- 對象名?instanceof 類型名

這里的student s = (student)obj;強(qiáng)制轉(zhuǎn)換是因?yàn)槿绻粡?qiáng)制轉(zhuǎn)換點(diǎn)不出來.num 和 .name



instanceof 用于判斷一個引用類型所引用的對象是否是一個類的實(shí)例
java.lang.String 重寫了equals()方法,把equals()方法的判斷變成了判斷其值。也重寫了toString()方法

//重寫toString():對象信息不要反悔類似內(nèi)存地址的信息,而是返回學(xué)生姓名給我。
@Override
public String toString() {
return this.name;
}
多態(tài)(動態(tài)綁定)
為什么使用多態(tài)?
掌握什么是多態(tài)?
多態(tài):同一個引用類型,使用不同的實(shí)例而執(zhí)行不同的操作。
父類類型指向子類對象:
Pet dog = new Dog();

繼承和方法重寫是實(shí)現(xiàn)多態(tài)的基礎(chǔ)
多態(tài):同一個引用類型,使用不同的實(shí)例而執(zhí)行不同的操作
繼承和方法重寫是實(shí)現(xiàn)多態(tài)的基礎(chǔ)
應(yīng)用:父類引用指向子類對象
抽象類和抽象方法

抽象類不能被實(shí)例化,實(shí)例化沒有任何實(shí)際意義。不可以直接new抽象類,但是可以new子類
例如不可以:Pet p = new Pet();
但是可以: Pet p = new Dog();
有抽象方法的類一定是抽象類
抽象類中不一定要有抽象方法
一個抽象類里面的抽象方法必須被子類實(shí)現(xiàn),除非子類也是抽象類。
向上轉(zhuǎn)型和向下轉(zhuǎn)型
如何實(shí)現(xiàn)向上轉(zhuǎn)型
如何實(shí)現(xiàn)向下轉(zhuǎn)型
熟練掌握instanceof的使用
向上轉(zhuǎn)型:父類的引用指向子類對象,自動進(jìn)行類型轉(zhuǎn)換
<父類型> <引用變量名> = new <子類型>();
Pet pet = new Dog();
此時通過父類引用變量調(diào)用的方法是子類覆蓋或繼承父類的方法,不是父類的方法。
此時通過父類引用變量無法調(diào)用那個子類特有的方法。
使用向上轉(zhuǎn)型以后無法調(diào)用子類的獨(dú)有方法時,可使用向下轉(zhuǎn)型
向下轉(zhuǎn)型:如果沒有轉(zhuǎn)換為真實(shí)的子類類型,此時會引發(fā)ClassCastException
java提供了instanceof運(yùn)算符來進(jìn)行類型的判斷,可以避免向下轉(zhuǎn)型時的異常


多態(tài)的兩種使用方式:
*使用父類作為方法的形參:是java中實(shí)現(xiàn)和使用多態(tài)的主要方式
*使用父類作為方法的返回值,也是java實(shí)現(xiàn)和使用多態(tài)的主要方式

多態(tài):根據(jù)具體的動物子類,調(diào)用其重寫后的shout。






方法重寫的規(guī)則是什么?
super的作用是什么?
繼承下構(gòu)造方法是如何執(zhí)行的?
Object類有奶爸寫方法常被子類重寫?
如何實(shí)現(xiàn)多態(tài)?
多態(tài)有哪兩種常用的應(yīng)用方式?
抽象類和接口:
抽象類和普通類的區(qū)別:
抽象類不可以被實(shí)例化。但是可以創(chuàng)建 一個引用變量,其類型是一個抽象類,指向非抽象的子類實(shí)例
抽象類里可以有非抽象的構(gòu)造方法,創(chuàng)建子類時

構(gòu)造方法就是創(chuàng)建對象以后進(jìn)行初始化
子類創(chuàng)建對象時,先調(diào)用父類的構(gòu)造方法,在調(diào)用子類的構(gòu)造方法



抽象方法vs普通方法
*有無方法體
接口
概念性的接口:指系統(tǒng)對外提供的所有服務(wù)
interface定義的實(shí)實(shí)在在的接口
[訪問修飾符] interface 接口名稱 [extends 其他的接口名]{
//聲明變量
//聲明方法
}

接口不可以有構(gòu)造方法。抽象類雖然不可以實(shí)例化,但是可以有構(gòu)造方法,因?yàn)闃?gòu)造方法可以讓子類實(shí)現(xiàn)父類構(gòu)造方法的復(fù)用。
接口可以被當(dāng)作類型使用:
實(shí)現(xiàn)類必須實(shí)現(xiàn)接口中的全部抽象方法,除非實(shí)現(xiàn)類也是一個抽象類。如果子類中有方法(接口中的抽象方法)沒有實(shí)現(xiàn),那么這個方法在子類中也定義為抽象類,子類變成抽象類。


雖然接口不是父類。但這種寫法也是對的:父類引用指向子類對象

方法的分類:普通方法 抽象方法(abstract) 靜態(tài)方法(static) 默認(rèn)方法(default)
默認(rèn)方法可以被繼承,通過實(shí)例調(diào)用





先繼承再實(shí)現(xiàn)
為什么jdk8以后新增接口特性??


is a 使用繼承關(guān)系
has a 使用接口
抽象類和接口 異同:
*相同點(diǎn):
代表系統(tǒng)的抽象層
都不能被實(shí)例化
都能包含抽象方法(用于描述系統(tǒng)提供的服務(wù),不必提供具體實(shí)現(xiàn))
*不同點(diǎn):
在抽象類中可以為部分普通方法提供默認(rèn)實(shí)現(xiàn)。JDK8之前接口中只能包含抽象方法,JDK8之后接口就可以包含默認(rèn)方法了
一個類只能繼承一個直接的父類,但可以實(shí)現(xiàn)多個接口
使用原則:

接口的好處:
提高了程序的可維護(hù)性和可拓展性
提高了程序的規(guī)范性
提高了程序的安全性

接口代表著一種 能力 約定 標(biāo)準(zhǔn)


何時聲明全局靜態(tài)常量:公用的,含義確定的,值也不變的
面向?qū)ο笤O(shè)計原則:
多用接口,少用繼承()
針對接口編程
針對拓展開放,針對改變關(guān)閉