解決JAVA中內部類所對應的外部類引用初始化的問題
java內部類的分類
java內部類的分類:成員內部類、區域性內部類、靜態內部類(巢狀類)、匿名內部類。在構建內部類物件時,需要一個指向其外部類物件的引用,而且這種引用的傳遞是通過內部類的構造器來完成的。
如果編譯器訪問不到這個引用就會報錯。
CASE 1:
// 用.new語法傳遞了外部類物件的引用
public class Outer
{
class Inner { }
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
}
}
由於對外部類引用的傳遞是通過構造器來完成的,故在子類繼承內部類的時候情況變得複雜起來。因為內部類缺少了對外部類物件的引用,而Test類的預設構造 器又無法向其提供,故編譯出錯。PS:Test() { super(); }這句寫不寫效果都一樣,而且僅僅用super();語句向內部類傳遞構造資訊是不夠的。
CASE 2:
// 編譯器提示:需要包含 Outer.Inner 的封閉例項
public class Outer
{
class Inner { }
}
class Test extends Outer.Inner
{
Test() { super(); }
public static void main(String[] args)
{
Test test = new Test();
}
}
為了解決這個難題,java語言提供了一種特殊的語法(enclosingClassReference.super();)來說明內部類與外部類物件引用之間的關聯。
注意:這是一種特殊的語法,任何非內部類中的使用都會報錯,無論super語句的字首是什麼。
CASE 3:
// 注意super語句前多了new Outer()
// 帶有瑕疵的解決方案:內部類關聯的物件是臨時建立的,有時候這樣的引用並不是你想要的
public class Outer
{
class Inner { }
}
class Test extends Outer.Inner
{
Test()
{
new Outer().super();
}
public static void main(String[] args)
{
Test test = new Test();
}
}
CASE 4:
// 或許這才是你想要的
public class Outer
{
class Inner { }
}
class Test extends Outer.Inner
{
Test( Outer o)
{
o.super();
}
public static void main(String[] args)
{
Outer outer = new Outer();
Test test = new Test(outer);
}
}
最後,需要注意的是語法enclosingClassReference.super();是java處理內部類繼承時的特殊語法,非內部類上下文中的使 用都會出錯;enclosingClassReference.super();與非內部類中super();語句的其中一個作用是一樣的,都控制轉向了 物件例項化的流程
(以上轉至http://hi.baidu.com/xiongshihu/item/89f43e2a905bd5ccdcf69ac0)
再來一個類似程式
package project_4;
public class InnerClassTest {
class Clothes{
private String material;
private int size;
private String color;
public String getColor(){
return color;
}
public void setColor(String color){
this.color=color;
}
public String getMaterial(){
return material;
}
public void setMaterial(String material){
this.material=material;
}
public int getSize(){
return size;
}
public void setSize(int size){
this.size=size;
}
}
}
class Coat extends InnerClassTest.Clothes{
public Coat(InnerClassTest o){
o.super(); //Coat類繼承了內部類Clothes,
//在構造方法中,o.super()實現了初始化父類引用的功能
}
}