1. 程式人生 > >解決JAVA中內部類所對應的外部類引用初始化的問題

解決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()實現了初始化父類引用的功能


    }
}