嵌套类之间的继承

时间:2015-08-27 13:16:07

标签: java inheritance inner-classes nested-class

我很难理解继承在嵌套类中是如何工作的,我在这里读过几个很好的问题,但是有些东西我不知道#&# 39; t get yet。

更具体地说,我希望这个例子

public class Main {
    public static void main(String[] args) {
        new O().new J();
    }
}

class O{
    O(){System.out.println("O");}
    class I extends O{I(){System.out.println("I");}}
    class J extends I{J(){System.out.println("J");}}  //compile time error here
}

运行并打印OOIJ,而我在类J定义上遇到此编译时错误:No enclosing instance of type O is available due to some intermediate constructor invocation

我理解这是因为嵌套类J在初始化之前需要O的实例存在,但我想我错过了一些关于我尝试创建J对象时发生的实例化链

为什么会这样?为什么要将I的定义更改为

    class I {I(){System.out.print("I");}}

避免任何编译时错误并按照我的预期打印OIJ

编辑:

我认为this主题只回答了我的第一个问题:

  

为什么会这样?

     

因为J的超类本身就是一个内在的阶级,因此制作   J的默认构造函数是非法的,因为它需要一个封闭   要提供给构造函数的实例。

但第二个问题仍未得到答复:

  

为什么将I的定义更改为

    class I {I(){System.out.print("I");}} 
     

避免任何编译时错误并按照我的预期打印OIJ

问题仍然存在吗? J的超类仍然是一个内部类,那为什么现在要编译呢?

注释

Further_1 ,如果我声明IJ方法本地

public class Main {
    public static void main(String[] args) {
        new O().foo();
    }
}

class O{
    O(){System.out.print("O");}
    void foo(){
        class I extends O{I(){System.out.print("I");}}
        class J extends I{J(){System.out.print("J");}}
        new J();
    }
}

没有错误发生,并按预期打印OOIJ

Further_2 ,如果我声明IJ静态

public class Main {
    public static void main(String[] args) {
        new O.J();
    }
}

class O{
    O(){System.out.print("O");}
    static class I extends O{I(){System.out.print("I");}}
    static class J extends I{J(){System.out.print("J");}}
}

我按预期得到OIJ

0 个答案:

没有答案