普通內部類默認持有指向所屬外部類的引用。如果新定義一個類來繼承內部類,那“秘密”的引用該如何初始化?
java提供了特殊的語法:
1 class Egg2 { 2 public class Yolk{ 3 public Yolk(){ 4 System.out.println("Egg2.Yolk"); 5 } 6 } 7 } 8 class BigEgg2 { 9 public class Yolk extends Egg2.Yolk { 10 public Yolk(){ 11 } 12 } 13 }
上面這段代碼編譯無法通過,錯誤在10行,錯誤為:
// No enclosing instance of type Egg2 is available due to some
// intermediate constructor invocation
修改代碼為:
1 class Egg2 { 2 public class Yolk{ 3 public Yolk(){ 4 System.out.println("Egg2.Yolk"); 5 } 6 } 7 } 8 class BigEgg2 { 9 public class Yolk extends Egg2.Yolk { 10 public Yolk(Egg2 egg2 ){ 11 egg2.super() ; 12 } 13 } 14 }
在11行新添加了egg2.super() ;這樣編譯就通過了~~·
然后再看另一段似乎有悖於上面結論的代碼:
1 class Egg2 { 2 public class Yolk{ 3 public Yolk(){ 4 System.out.println("Egg2.Yolk"); 5 } 6 } 7 } 8 class BigEgg2 extends Egg2 { 9 public class Yolk extends Egg2.Yolk { 10 public Yolk(){ 11 } 12 } 13 }
注意8行繼承和11行並沒有使用super語句,但是這段代碼可以正常編譯,為什么?
我猜想的原因:
使用super語法目的是為了讓導出類獲得外圍類的引用,也就是讓BigEgg2.Yolk類獲得Egg2的引用。再看上面代碼,BigEgg2繼承自Egg2,所以BigEgg2擁有Egg2的引用。
BigEgg2.Yolk是BigEgg2的內部類,所以Yolk隱式持有BigEgg2的引用,所以通過這個引用鏈,BigEgg2.Yolk擁有Egg2的引用。所以不需要使用super語法。