解决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()实现了初始化父类引用的功能

    }
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值