標籤:
謎題66
繼承的問題。
對於執行個體方法:命名同樣時,子類會覆寫父類的方法,且訪問許可權至少和父類一樣大。
對於域:命名同樣時,子類會隱藏父類的域,且訪問許可權隨意。
謎題67
不要重用庫中的類名。
謎題68
命名的問題。
類名應該以大寫字母開頭,形式為:MixedCase。
變數以小寫字母開頭,形式為:mixedCase。
常量以大寫字母開頭,形式為:MIXED_CASE。
單個大寫字母,僅僅能用於類型參數,形式為:Map<K, V>。
包名應該都是小寫,形式為:lower.case。
當一個變數和一個類型具有同樣的名字,而且作用於同樣的範圍時,變數名具有優先權。
即:變數名遮掩(obscure)類型名。相同變數名和類型名能夠遮掩包名。
class X {static class Y {static String Z = "Black";}static C Y = new C();}class C {String Z = "White";}public class ShadesOfGray {public static void main(String[] args) {System.out.println(X.Y.Z); //輸出結果是:White}}
謎題69
怎樣引用上題中的被遮掩的類型名。技巧在某一種特殊的文法上下文環境中使用該名字,文法上下文環境同意出現一個類型名可是不同意出現變數。技巧一
<span style="font-size:18px;">System.out.println(((X.Y)null).Z);</span>
技巧二
<span style="font-size:18px;">static class Xy extends X.Y{};System.out.println(Xy.Z);</span>
技巧三: 5.0版本號碼之後
<span style="font-size:18px;">public static <T extends X.Y> void main(String[] args) { System.out.println(T.Z);}</span>
謎題70
具有包內訪問許可權修飾的方法的類,在其它包內被繼承時,該方法不可能被覆寫。
即使是方法名同樣,也是兩個不同的方法。
謎題71
名字重用導致遮蔽(shade):一個聲明僅僅能遮蔽類型同樣的還有一個聲明。靜態匯入Arrays.toString,當在類中使用toString()時,會調用Object類中的toString方法。
謎題72
名字重用的問題。
final修飾符
對於方法:執行個體方法不能覆寫,靜態方法不能隱藏。
對於域:不能被賦值超過一次。因此能夠被隱藏。
謎題73
遮蔽:被遮蔽類型能夠來自外圍類,而不是來自庫。
隱藏:本來調用的父類的變數,結果聲明了一個同名的私人的變數。
謎題74
重載方法要確定全部的重載版本號碼一致。
謎題75
版本號碼升級後帶來的不一致,瞭解就可以。
名字重用術語表
覆寫(override)一個執行個體方法能夠覆寫(override)在其超類中可訪問大的具有同樣簽名的全部執行個體方法,從而能動態指派,,VM將基於執行個體執行期類型來選擇要調用的覆寫方法。
class Base { public void f(){}}class Derived extends Base { public void f() {} //override Base.f()}
重載(overload)同一個類中,方法名同樣,簽名不同。重載的方法是編譯期選定的
class A { public void f (int i){} public void f (String s) {}}
隱藏(hide)子類中的一個域、靜態方法或成員類型能夠隱藏超類中可訪問到具有同名的全部與、靜態方法或成員類型。隱藏一個成員將阻止其被繼承。
class Base { public static void f() {}}class Derived extends Base { public static void f() {}}
遮蔽(shadow)變數、方法或類型能夠遮蔽文本範圍內具有同樣名字的全部變數、方法、或類型。
class WhoKnows { static Stirng sentence = "I do not know"; public static void main(String [] args) { String sentence = "i know"; //shadow static field system.out.println(sentence); }}
遮掩(obscure)變數能夠遮掩同一範圍內同樣名字的類型,變數或者類型能夠遮掩一個包。
public class Obscure { static String System; //Obscures type java.lang.System public static void main(String[] args) { System.out.println("hello"); //won't compile }}
Java解惑七:很多其它類之謎