代碼當中的多態,就是父類引用指向子類對象的意思。安全
格式以下:對象
父類名稱 對象名 = new 子類名稱();接口
或者io
接口名稱 對象名 = new 實現類名稱();編譯
訪問成員變量的兩種方法:table
1).直接經過對象名訪問成員變量,看等號左邊(父類名稱 對象名 = new 子類名稱();的等號左邊)是誰,就優先用誰。ast
2).間接經過成員方法訪問成員變量,看方法屬於誰,就優先用誰,沒有則向上找。class
成員方法的訪問規則:new的是誰,就優先用誰,沒有則向上找。
口訣:變量
成員方法:編譯看左邊,運行看右邊。權限
成員變量:編譯看左邊,運行看左邊。
不管右邊new的時候,換成哪一個子類對象,等號左邊的調用方法都不用改變。
向上轉型,就是多態寫法。
格式:
父類名稱 對象名 = new 子類名稱();
含義:右側建立了一個子類對象,把它看成父類來看待使用,例如貓類屬於動物類,因此貓的父類就是動物,把具體的一隻貓看成動物來看待,就是向上轉型。
在向上轉型中,必定是安全的。
但向上轉型有一個弊端:對象一旦向上轉型了,就沒法調用子類本來有的內容了。因此須要向下轉型,來幫助訪問子類本來有的內容。
格式:
子類名稱 對象名 = (子類名稱) 父類對象;
含義:將父類對象還原成原本的子類對象。
注意事項:
1).向下轉型時,必須保證對象原本建立的就是一隻「貓」,才能成功向下轉型。
2).若是對象建立時不是一隻「貓」,如今非要向下轉型成爲「貓」,就會致使運行報錯(編譯不會報錯,但在運行時會出現異常:Java.Class.ClassCastException,類轉換異常)。
在這裏,可使用instanceof關鍵字進行輔助啊判斷是否是向下轉型。
使用格式:
對象 instanceof 類名稱
這將會獲得一個布爾值,也就是判斷前面對象能不能當作後面類型的實例。
final表明最終的,不可改變的。
常見的用法有:
1).用來修飾一個類。 2).用來修飾一個方法。
3).用來修飾一個局部變量。 4).用來修飾一個成員變量。
當用來修飾類時,格式:
public final class 類名稱{ //...}
含義:當前這個類不能有任何子類,但能夠有父類。
注意:若是一個類是final類,那麼其中全部的成員方法都沒法進行覆蓋重寫。
當用來修飾成員方法時,格式:
修飾符 final 返回值類型 方法名(參數類){方法體}
當final關鍵字用來修飾方法時,這個方法就是最終方法,也就是不可以被覆蓋重寫。
注意:
對於類和方法,final關鍵字和abstract關鍵字不能同時使用,由於二者本就相互矛盾。
當final關鍵字修飾局部變量時:
final修飾局部變量後,那麼這個變量將不能進行修改,即不可變。
其中,這個「不可變」,對於基本類型來講,是指變量當中的數值不可變。
對於應用類型來講,是指變量中的地址值不可變。
當final用來修飾成員變量時:
對成員變量,若是使用final關鍵字修飾,那麼這個變量將不可變。
注意:
1).因爲成員變量具備默認值,因此在用了final關鍵字後必須對成員變量進行手動賦值,不會再給默認值。
2).對於final變量,要麼直接賦值,要麼使用構造方法賦值,兩者選其一。
3).必須保證類當中全部的重載方法都最終會對final成員變量賦值。
public > protected > (default) > private
public | protected | (default) | private | |
同一個類 | √ | √ | √ | √ |
同一個包 | √ | √ | √ | × |
不一樣包子類 | √ | √ | × | × |
不一樣包非子類 | √ | × | × | × |
注意:
1).對(default),該關鍵字不是default關鍵字,而是什麼都不寫。
2).表格中的√表示能夠互相訪問,×表示不能互相訪問。