1
public class InnerClass {
    class Inner
    {
        public void method()
        {
            System.out.println("Innerclass");
        }
    }
}

class Sample extends InnerClass.Inner
{
    public static void main(String [] arg)
    {
        Sample s = new Sample(new InnerClass());
        s.method();

    }

//为什么这是强制性的???

    Sample(InnerClass i) {
        i.super();
    }

    @Override
    public void method() {
        System.out.println("derived class");
    }
}

当我创建一个派生自内部类(Innerclass.Inner)的类时,默认构造函数不起作用。后来我才知道它需要包含一个带有封闭类引用的构造函数,为什么会这样?

4

2 回答 2

2

Java 中的非静态内部类具有对封闭实例的隐式引用。您可以通过以下方式解决您的问题:

public class InnerClass {
    static class Inner // can make it public too
    {
        public void method()
        {
             System.out.println("Innerclass");
        }
    }
}

只是不要期望能够在没有特定实例的情况下调用 InnerClass 上的任何方法。

于 2013-05-23T14:14:31.363 回答
0

因为非静态内部类有一个隐式成员指向它们的外部类,如果不给它那个指针就不能创建内部类的实例。如果你直接创建一个内部类的实例,你必须使用new outer.Inner()(或者它可能是outer.new Inner(),我不记得了)。但是 Sample 不是内部类,它只是继承了一个,因此外部实例必须在其构造函数中传递给基构造函数。因此,它需要有一些可用的外部实例,或者自己创建它。

于 2013-05-23T14:16:03.657 回答