java繼承內部類問題(java編程思想筆記)


普通內部類默認持有指向所屬外部類的引用。如果新定義一個類來繼承內部類,那“秘密”的引用該如何初始化?

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語法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM