`
hehaibo
  • 浏览: 410522 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

内部类知识总结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();

    }

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics