面向物件:封裝,繼承,多型
類:相關屬性和行為的集合, 物件:該類的具體體現
成員變數和區域變數的區別:
位置:成員變數在類中方法外;區域變數在方法定義中或者方法宣告上,
記憶體中的位置:成員變數在堆記憶體;區域變數在堆疊記憶體,
生命周期:成員變數隨著物件的創建而存在,隨著物件的消失而消失;區域變數隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
初始化值:成員變數有默認初始化值;區域變數沒有默認初始化值,必須定義,賦值,然后才能使用,
匿名物件:僅僅只呼叫一次的時候,匿名物件呼叫完就是垃圾,可以被GC回收
用法:匿名物件可以直接呼叫方法,也可以作為實際引數傳遞
封裝:指隱藏物件的屬性和實作細節,僅對外提供公共訪問方法,提高代碼復用性,提高代碼安全性,
原則:將不需要對外提供的內容隱藏起來,把屬性隱藏,提供公共方法對其訪問,
private關鍵字:被private修飾的成員變數或成員方法只能在本類中訪問,
this關鍵字:當前類的物件參考
構造方法:給物件的資料進行初始化,方法名與類名相同,沒有回傳值型別,沒有回傳值,
創建物件做了哪寫事情:Student s = new Student();
把Student.class檔案加載到記憶體
在堆疊記憶體給s變數開辟一個空間
在堆記憶體為學生物件申請一個空間
給成員變數進行默認初始化
給成員變數進行顯示初始化
通過構造方法給成員變數進行初始化
資料初始化完畢,把堆記憶體的地址值賦值給s變數
static關鍵字(修飾成員變數,成員方法):針對多個物件有共同的成員變數的時候,Java提供static關鍵字來修飾
特點:隨著類的加載而加載
優先于物件存在
被類的所有物件共享
可以通過類名來呼叫,也可以通過物件名呼叫
靜態修飾的內容:與類相關的,類成員
注意事項:
A. 靜態方法中沒有this關鍵字:靜態是隨著類的加載而加載,this是隨著物件的創建而存在,靜態比物件先存在
B. 靜態方法只能訪問靜態的成員變數和靜態成員方法,非靜態方法可以訪問靜態或非靜態成員變數,也可以訪問靜態或非靜態的成員方法
靜態變數和成員變數的區別
所屬:靜態變數屬于類,所有也稱為類變數;成員變數屬于物件
記憶體中的位置:靜態變數存盤于方法區的靜態區;成員變數存盤于堆記憶體
記憶體出現時間不同:靜態變數隨著類的加載而加載,隨著類的消失而消失;成員變數隨著物件的創建而存在,隨著物件的消失而消失
呼叫:靜態變數可通過類名呼叫,也可通過物件呼叫;成員變數只能通過物件名呼叫
main方法是靜態的,不需要創建物件,通過類名就可以,方便JVM呼叫
繼承:多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,多個類無需再定義這些屬性和行為,只要繼承即可,通過extends關鍵字實作類與類的繼承
好處:提高代碼復用性,提高代碼維護性,讓類與類產生關系,是多型的前提
弊端:耦合性增強了,打破了封裝性
特點:Java只支持單繼承,不支持多繼承,支持多層繼承
子類不能繼承父類私有方法,只能繼承父類所有非私有的成員;子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類的構造方法;不要為了部分功能而去繼承,當子類需要使用父類的所有方法的時候去使用繼承,體現“B is a A”的關系,
繼承中成員變數的關系:
1)子類中的成員變數和父類中的成員變數不一樣,
2) 子類中的成員變數和父類中的成員變數一樣,(就近原則)
在子類方法中訪問一個變數的查找順序:
子類方法的區域范圍找---->子類的成員范圍找----->父類的成員范圍找
super關鍵字:代表父類存盤空間的標識(可以理解為父類的參考,可以操作父類的成員)
繼承中構造方法的關系:
1)子類中所有的構造方法默認都會訪問父類中空引數的構造方法
2)子類會繼承父類中的資料,可能還會使用父類的資料,所以,子類初始化之前,一定要先完成父類資料的初始化,
子類的每一個構造方法的第一條陳述句默認都是:super()
使用super關鍵字可以去呼叫父類的帶參構造方法
一個類的初始化程序:成員變數初始化,默認初始化,顯示初始化,構造方法初始化
子父類的初始化(分層初始化):先進行父類初始化,然后進行子類初始化
繼承中成員方法的關系:
通過子類呼叫方法:先找子類---->再找父類
方法重寫:子類中出現了和父類中方法宣告一模一樣的方法
注意事項:父類中私有方法不能被重寫,因為父類私有方法子類根本就無法繼承
子類重寫父類方法時,訪問權限不能更低,最好一致
方法重寫和方法多載的區別:
方法重寫override:在子類中出現和父類一樣的方法宣告的現象
方法多載overload:在同一個類中,出現的方法名相同,引數串列不同的現象
This和super的區別:
this代表當前類的參考
super代表父類的儲存空間標識(可以理解為父類的參考,通過super訪問父類的成員)
final關鍵字:可以修飾類,方法,變數
final修飾類,該類不能被繼承
final修飾方法,該方法不能被重寫,(覆寫,復寫)
final修飾變數,該方法不能被重新賦值,此時這個變數就是常量
final關鍵字修飾區域變數:
final修飾基本型別,值不能變,
final修飾參考變數,是指地址值不變,
fina修飾變數的初始化時機:
被final修飾的變數只能賦值一次
在構造方法完畢前,(非靜態的常量)
多型:同一個物件(事物),在不同時刻體現出來的不同狀態
前提:要有繼承關系或者介面實作關系,要有方法重寫,要有父類或者父介面 參考指向子類物件
多型中的成員訪問特點:(父類 f = new 子類(); )
1)成員變數:編譯看左邊,運行看左邊,
2)構造方法:創建子類物件的時候,訪問父類的構造方法,對父類的資料進行初始化
3)成員方法:編譯看左邊,運行看右邊
4)靜態方法:編譯看左邊,運行看左邊(靜態和類相關,算不上重寫,所以訪問還是左邊的)
好處:提高代碼的維護性(繼承保證了這個優點)
提高了代碼的擴展性
弊端:不能使用子類的特有功能
物件間轉型問題:
向上轉型:父類 f = new 子類();
向下轉型:子類 z = (子類)f; 要求該父物件必須是能夠轉換為Zi的
ClassCastException:型別轉換例外,可能發生在向下轉型中,
抽象類
抽象類的特點:
抽象類和抽象方法必須用abstract修飾
抽象類中比一定有抽象方法,但是有抽象方法的類必須定義為抽象類
抽象類不能實體化
因為它不是具體的,
抽象類有構造方法,但是不能實體化 ?構造方法的作用是什么,用于子類訪問父類資料的初始化
抽象類的子類:
a. 如果不想重寫抽象方法,該子類是一個抽象類
b. 重寫所有的抽象方法,這個時候子類是一個具體的類
抽象方法不能有主體
抽象類的實體化其實是靠具體的子類實作的,是多型的方法
Animal a = new Cat();
抽象類的成員特點:
成員變數:既可以是變數也可以是常量
構造方法:有,用于子類訪問父類資料的初始化
成員方法:既可以是抽象的也可以的非抽象的
抽象類的成員方法特性:
A:抽象方法,強制要求子類做的事情
B:非抽象方法,子類繼承的事情,提高代碼復用性
面試問題: 一個類如果沒有抽象方法,可以不可以定義為抽象類,有什么意義:
可以,不讓創建物件,不能new實體化
抽象類不能和哪些關鍵字共存:
private 沖突(非法的修飾符組合);final 沖突;static 無意義,
介面
特點:
介面用關鍵字Interface表示:interface 介面名{}
類實作介面用implements表示:class 類名 implements 介面名 {}
介面不能實體化:按照多型的方式來實體化
介面的子類:可以是抽象類但是意義不大;可以是具體類,要重寫介面中的所有抽象方法,
由此可見多型的體現: 具體類多型,抽象類多型,介面多型
成員特點
成員變數:介面中的變數默認是常量,并且是靜態的,默認修飾符:final, static
構造方法:介面沒有構造方法,
成員方法:介面方法必須是抽象的,默認修飾符:public abstract
類與類:繼承關系,只能單繼承,可以多層繼承,
類與介面:實作關系,可以單實作,也是可以多實作,并且還可以在繼承一個類的同時實作多個介面
介面與介面:繼承關系,可以單繼承,也可以多繼承
抽象類和介面的區別:
成員區別:抽象類:成員變數:可以變數,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
介面:成員變數:只可以常量
成員方法:只可以抽象
關系區別:
類與類:繼承,單繼承
類與介面:實作,單實作,多實作
介面與介面:繼承,單繼承 ,多繼承
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
代碼塊:
區域代碼塊:區域位置,用于限定變數的生命周期,及盡早釋放提高記憶體利用率
構造代碼塊:在類中的方法外出現,把多個構造方法方法中相同的代碼存放到一起,每次呼叫構造都執行,并且在構造方法前執行,一般對物件進行初始化
靜態代碼塊:在類中的方法外出現,用static修飾,一般是對類進行初始化,
靜態代碼塊,構造代碼塊,構造方法的執行順序?
靜態代碼塊--->構造代碼塊--->構造方法
且靜態代碼塊只執行一次,構造代碼塊每次呼叫構造方法都執行
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355.html
標籤:Java
上一篇:Integer小知識,涉及IntegerCache,1000==1000為false而100==100為true
下一篇:Java回圈結構_常量_關鍵字
