2
public class Test {
    class Foo {
        int frob() {
            return 7;
        }
    }

    class Bar extends Foo {
        @Override
        int frob() {
            return 8;
        }
    }

    class Baz extends Foo {
        @Override
        int frob() {
            return 9;
        }
    }

    public static int quux(Bar b) {
        return b.frob();
    }

    public static void main(String[] args) {
        System.out.println(quux(new Bar()));//this line gives non-static variable this cannot be referenced from a static context
    }

}
4

3 回答 3

3

您可以通过将嵌套类声明为static或通过在Test实例的上下文中实例化Bar来解决此问题。

它失败是因为(非静态)Bar必须在现有Test类实例的上下文中实例化;由于main是静态的,因此没有这样的野兽。

于 2012-12-01T05:27:40.587 回答
3
public static void main(String[] args) {
    Test test = new Test();
    System.out.println(quux(test.new Bar()));
}
于 2012-12-01T05:28:42.073 回答
2

非静态内部类具有对封闭类实例的隐藏引用。这意味着您必须有一个封闭类的实例才能创建内部类。您还必须使用一个特殊的“新”函数来正确初始化对封闭类的隐藏引用。例如,

   class Outer{   
        class Inner{
           public Inner() {
               System.out.println("Hello there.");
           }
        }

        public static void main(String args[]) {
            Outer o = new Outer();     
            Outer.Inner i = o.new Inner();
        }
    }
于 2012-12-01T05:39:29.930 回答