1. 程式人生 > 其它 >回顧總結6+7

回顧總結6+7

IDEA

常用快捷鍵

不熟

  1. 檢視類的層級關係:ctrl +H

  2. 刪除當前行:crtl + Y

  3. 補全程式碼:alt + /

  4. 快速格式化程式碼:ctrl + alt + L

  5. 快速執行程式:自己定義,參考alt +R

  1. 定位到方法:ctrl +左擊

  2. 自動配置變數名:.var或alt +enter

  3. 匯入類:alt + enter

  4. 生成構造器:alt + insert

  5. 複製當前行:ctrl + D

  6. 添加註釋:ctrl + /

常用模板

main方法:psvm/main

輸出語句:sout

迴圈:fori

學會查詢模板、定義模板

修飾符

修飾符可以修飾屬性、成員方法和類

  • 類只能用piblic和預設的修飾

  • 範圍依次為public > 受保護的 > 預設 >私有的

  • 所有的 > 同包或子類 > 同包 > 同類

繼承

細節

  1. 子類繼承了所有的屬性和方法(所有,包括私有)

    • 非私有的屬性和方法可以在子類中直接訪問

    • 私有屬性和方法不能在子類中直接訪問,要通過父類的公共方法去間接訪問。(本質上還是父類在訪問?)

  2. 子類物件生成時,先呼叫父類的無參構造器,然後是子類的構造器,如果父類定義了有參構造,且沒有無參構造的話,需要在子類構造器加上具體super(引數名)

重寫

方法重寫

  1. 子類的方法的引數,方法名稱,要和父類方法的引數,方法名稱完全一樣。

  2. 子類方法的返回型別和父類方法返回型別一樣,或者是父類返回型別的子類。比如父類返回型別是Object,子類返回型別是String

  3. 子類方法不能縮小父類方法的訪問許可權(修飾符)。

名稱範圍方法名形參列表返回型別修飾符
過載(overload) 本類 必須一樣 型別、個數、順序至少有一個不同 無要求 無要求
重寫(override) 父子類 必須一樣 相同 子類重寫的方法,返回的型別和父類返回的型別一致,或者是其子類 子類方法不能縮小父類方法的訪問範圍

多型

方法的多型

多型就是同一個行為具有多個不同表現形式或形態的能力(即見人說人話,見鬼說鬼話)

多型的表現形式:過載和重寫。

過載:根據傳遞的不同值,給予不同的結果。(方法名是一樣的)

重寫:根據物件例項的不同,呼叫不同的方法。(方法名是一樣的,但是內容不一樣)

物件的多型

  1. 一個物件的編譯型別和執行型別可以不一致

  2. 編譯型別在定義物件時,就確定了,不能改變

  3. 執行型別是可以變化的

  4. 編譯型別看定義時 = 號的左邊,執行時型別看 = 的右邊

實用案例

方法定義的形參為父類型別,實參型別允許為子類型別

對於狗吃骨頭,貓吃魚,主人負責喂(方法)。

我們需要建7個類,主人、狗(動物)、貓(動物)、骨頭(食物)、魚(食物)。

使用 喂 方法的時候,需要傳遞具體的動物例項物件,和食物例項物件。

對於過去傳統方法而言,我們每一次都是傳入具體的物件的例項。即引用型別和例項型別一致。如給喂方法,傳遞狗(動物)和骨頭(食物)。

使用多型後,我們可以把父類的引用指向子類例項。把方法的形參傳入父類,即動物和食物。要用的時候,把動物的例項物件狗和骨頭作為實參傳遞進去。

編譯時和執行時

編譯型別 引用名 = new 執行型別

  • 多型的向上轉型:父類的引用指向了子類例項

  1. 編譯階段,能夠呼叫那些成員,要看編譯型別。

  2. 執行時,呼叫那些成員,看執行型別。

  3. 可以呼叫父類的所有成員

  4. 不能呼叫子類的特有成員

子類型別 引用名 = (子類型別)父類引用

  • 多型的向下轉型:父類的引用型別強制轉換成子類引用型別

  1. 只能強轉父類的引用,不能強轉父類的物件

  2. 要求父類的引用必須指向的是當前目標型別的物件

  3. 可以呼叫子類型別中的所有成員

細節

結論:屬性的值看編譯型別,方法看執行型別

思考:為什麼方法有重寫,屬性是隱藏。

  1. 編譯的時候,相當於給我們定了一個模板。我們要用的屬性、方法,都要從這個模板上找,找到了就能用,沒有的就用不了。

  2. 執行的時候,就是new的時候,我們先把這個模板拿過來,然後開始生成子類自己的屬性,因為父類的屬性和方法是能完全繼承下來的,所以,剛好佔滿一個模板。

    (1)生成子類自己的屬性時,模板空間是滿的,屬性是不能修改的,只能生成新的空間存放屬性。

    (2)生成子類自己的方法時,因為繼承的關係,我們有方法的空間,需要修改的時候,也是在原有空間上改動,所以方法,還是在模板空間裡。不會生成新的空間。

  3. 我們呼叫的時候呢,是在模板裡找東西,所以找的東西就是子類的方法,和父類的屬性。

動態繫結機制

  • 呼叫物件方法時,該方法會和該物件的記憶體地址/執行型別繫結(記憶體地址就是new出來的物件的地址,執行型別指的也是)

總結:方法優先從子類呼叫(執行型別),不管這個方法是在哪裡

  • 當呼叫物件屬性時,沒有動態繫結機制,哪裡宣告,哪裡使用(因為屬性是在編譯時就確定的,所以那個類中呼叫,就使用那個類的屬性)

Object類方法

== 和equals

==

可以比較基本資料型別和引用資料型別

equals

只能判斷引用型別,大多數判斷引用型別中的值。

hashCode

小結

  1. 提高具有雜湊結構的容器的效率

  2. 兩個引用,如果指向的是同一個物件,則雜湊值肯定是一樣的

  3. 兩個引用,如果指向的是不同物件,則雜湊值是不一樣的

  4. 雜湊值主要根據地址號來的,不能完全將雜湊值等價於地址

finalize

垃圾回收

  1. 當物件被回收時,系統是通過自動呼叫該物件的finalize方法實現垃圾回收機制的。子類可以重寫該方法,做一下釋放資源的操作。

  2. 什麼時候回收,當某個物件沒有任何引用時,則JVM就認為這個物件是一個垃圾物件,就會使用垃圾回收機制來銷燬該物件,在銷燬該物件前,會呼叫finalize方法。

  3. 垃圾回收機制的呼叫,是由系統來決定,也可以通過System.gc方法主動觸發垃圾回收機制。

斷點除錯!!!

很有用的功能,有用在哪,不會。

程式設計風格

儘量一段程式碼,完成一個小功能,不要混在一起。

便於程式碼的維護和擴充套件。