内部类知识总结2--内部类继承和同名问题

内部类的继承:

 

class Outer {

    privateinta;

    public Outer(int a) {

       this.a = a;

    }

    class Inner {//内部类

       public Inner() {

       }

       publicvoid print() {

           System.out.println("a=" + a);

       }

    }

    //内部继承

    class InnerSub extends Inner {

    }

}

 

publicclass Testman extends Outer.Inner {

 

    // public Testman(){}//编译错误 java虚拟机无法决定让Testman实例引用哪个Outer实例。

    // 通过传递Outer实例的引用然后在构造方法中调用super语句来建立外部类和内部类之间的关联关系

    public Testman(Outer o) {

       o.super();

    }

 

    publicstaticvoid main(String[] args) {

       Outer o1 = new Outer(1);

       Outer o2 = new Outer(2);

       // in变量引用的inner实例会自动引用o1变量引用的实例。

       Outer.Inner in = o1.new Inner();

       in.print();

       Testman t1 = new Testman(o1);

       t1.print();// print 1

       Testman t2 = new Testman(o2);

       t2.print(); // print 2

    }

}

在直接构造实例内部类的实例的时候 java虚拟机会自动使用内部类实例引用它的外部内实例。

 

子类和父类中的内部类同名的问题:

内部类并不存在覆盖的概念,假如子类和父类中存在同名的内部类,那么这个内部类也会分别在不同的名字空间中,因此不会发生冲突。Outers.Inner SubOuter.Inner类是独立的两个类。不存在覆盖关系。Java编译器不会检查子类中的Inner类是否缩小了父类中的Inner类的访问权限。

class Outers {

    Inner in;

 

    public Outers() {

       in = new Inner();// 构造内部类实例

    }

    publicclass Inner { // public访问级别

       public Inner() {

           System.out.println("inner of Outer");

       }

    }

}

 

publicclass SubOuter extends Outers {

    class Inner {

       public Inner() {

           System.out.println("inner of SubOuter");

       }

    } 

    publicstaticvoid main(String[] args) {

       //执行 new SubOuter()会调用父类的构造方法

       SubOuter.Inner subOuter= new SubOuter().new Inner();

       Outers.Inner outer = new Outers().new Inner();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值