回顧總結6+7
常用快捷鍵
不熟
-
檢視類的層級關係:ctrl +H
-
刪除當前行:crtl + Y
-
補全程式碼:alt + /
-
快速格式化程式碼:ctrl + alt + L
-
快速執行程式:自己定義,參考alt +R
熟
-
定位到方法:ctrl +左擊
-
自動配置變數名:.var或alt +enter
-
匯入類:alt + enter
-
生成構造器:alt + insert
-
複製當前行:ctrl + D
-
添加註釋:ctrl + /
常用模板
main方法:psvm/main
輸出語句:sout
迴圈:fori
學會查詢模板、定義模板
修飾符
修飾符可以修飾屬性、成員方法和類
-
類只能用piblic和預設的修飾
-
範圍依次為public > 受保護的 > 預設 >私有的
-
所有的 > 同包或子類 > 同包 > 同類
繼承
細節
-
子類繼承了所有的屬性和方法(所有,包括私有)
-
非私有的屬性和方法可以在子類中直接訪問
-
私有屬性和方法不能在子類中直接訪問,要通過父類的公共方法去間接訪問。(本質上還是父類在訪問?)
-
-
子類物件生成時,先呼叫父類的無參構造器,然後是子類的構造器,如果父類定義了有參構造,且沒有無參構造的話,需要在子類構造器加上具體super(引數名)
重寫
方法重寫
-
子類的方法的引數,方法名稱,要和父類方法的引數,方法名稱完全一樣。
-
子類方法的返回型別和父類方法返回型別一樣,或者是父類返回型別的子類。比如父類返回型別是Object,子類返回型別是String
-
子類方法不能縮小父類方法的訪問許可權(修飾符)。
名稱 | 範圍 | 方法名 | 形參列表 | 返回型別 | 修飾符 |
---|---|---|---|---|---|
過載(overload) | 本類 | 必須一樣 | 型別、個數、順序至少有一個不同 | 無要求 | 無要求 |
重寫(override) | 父子類 | 必須一樣 | 相同 | 子類重寫的方法,返回的型別和父類返回的型別一致,或者是其子類 | 子類方法不能縮小父類方法的訪問範圍 |
多型
方法的多型
多型就是同一個行為具有多個不同表現形式或形態的能力(即見人說人話,見鬼說鬼話)
多型的表現形式:過載和重寫。
過載:根據傳遞的不同值,給予不同的結果。(方法名是一樣的)
重寫:根據物件例項的不同,呼叫不同的方法。(方法名是一樣的,但是內容不一樣)
物件的多型
-
一個物件的編譯型別和執行型別可以不一致
-
編譯型別在定義物件時,就確定了,不能改變
-
執行型別是可以變化的
-
編譯型別看定義時 = 號的左邊,執行時型別看 = 的右邊
實用案例
方法定義的形參為父類型別,實參型別允許為子類型別
對於狗吃骨頭,貓吃魚,主人負責喂(方法)。
我們需要建7個類,主人、狗(動物)、貓(動物)、骨頭(食物)、魚(食物)。
使用 喂 方法的時候,需要傳遞具體的動物例項物件,和食物例項物件。
對於過去傳統方法而言,我們每一次都是傳入具體的物件的例項。即引用型別和例項型別一致。如給喂方法,傳遞狗(動物)和骨頭(食物)。
使用多型後,我們可以把父類的引用指向子類例項。把方法的形參傳入父類,即動物和食物。要用的時候,把動物的例項物件狗和骨頭作為實參傳遞進去。
編譯時和執行時
編譯型別 引用名 = new 執行型別
-
多型的向上轉型:父類的引用指向了子類例項
-
編譯階段,能夠呼叫那些成員,要看編譯型別。
-
-
可以呼叫父類的所有成員
-
不能呼叫子類的特有成員
子類型別 引用名 = (子類型別)父類引用
-
多型的向下轉型:父類的引用型別強制轉換成子類引用型別
-
只能強轉父類的引用,不能強轉父類的物件
-
要求父類的引用必須指向的是當前目標型別的物件
-
可以呼叫子類型別中的所有成員
細節
結論:屬性的值看編譯型別,方法看執行型別
思考:為什麼方法有重寫,屬性是隱藏。
-
編譯的時候,相當於給我們定了一個模板。我們要用的屬性、方法,都要從這個模板上找,找到了就能用,沒有的就用不了。
-
執行的時候,就是new的時候,我們先把這個模板拿過來,然後開始生成子類自己的屬性,因為父類的屬性和方法是能完全繼承下來的,所以,剛好佔滿一個模板。
(1)生成子類自己的屬性時,模板空間是滿的,屬性是不能修改的,只能生成新的空間存放屬性。
(2)生成子類自己的方法時,因為繼承的關係,我們有方法的空間,需要修改的時候,也是在原有空間上改動,所以方法,還是在模板空間裡。不會生成新的空間。
-
我們呼叫的時候呢,是在模板裡找東西,所以找的東西就是子類的方法,和父類的屬性。
動態繫結機制
-
呼叫物件方法時,該方法會和該物件的記憶體地址/執行型別繫結(記憶體地址就是new出來的物件的地址,執行型別指的也是)
總結:方法優先從子類呼叫(執行型別),不管這個方法是在哪裡
-
當呼叫物件屬性時,沒有動態繫結機制,哪裡宣告,哪裡使用(因為屬性是在編譯時就確定的,所以那個類中呼叫,就使用那個類的屬性)
Object類方法
== 和equals
==
可以比較基本資料型別和引用資料型別
equals
只能判斷引用型別,大多數判斷引用型別中的值。
hashCode
小結
-
提高具有雜湊結構的容器的效率
-
兩個引用,如果指向的是同一個物件,則雜湊值肯定是一樣的
-
兩個引用,如果指向的是不同物件,則雜湊值是不一樣的
-
雜湊值主要根據地址號來的,不能完全將雜湊值等價於地址
finalize
垃圾回收
-
當物件被回收時,系統是通過自動呼叫該物件的finalize方法實現垃圾回收機制的。子類可以重寫該方法,做一下釋放資源的操作。
-
什麼時候回收,當某個物件沒有任何引用時,則JVM就認為這個物件是一個垃圾物件,就會使用垃圾回收機制來銷燬該物件,在銷燬該物件前,會呼叫finalize方法。
-
垃圾回收機制的呼叫,是由系統來決定,也可以通過System.gc方法主動觸發垃圾回收機制。
斷點除錯!!!
很有用的功能,有用在哪,不會。
程式設計風格
儘量一段程式碼,完成一個小功能,不要混在一起。