静态上下文中的外类

时间:2015-11-06 18:41:16

标签: java

如果有一个内部匿名类的类如下:

class D {
    void j() {
        System.out.println("D");
    }

    public static void main(String[] args) {
        D d = new D() {
            @Override
            void j() {
                System.out.println("Anonymous!");
            }
        };
        d.j();
        // D.this.j();
        // super.j();

    }
}

如何调用打印“D”的“外部”方法j()?

我知道如果它不是静态的(因为main方法是静态的)那么我可以使用: D.this.j();
我知道匿名内部类中的j()方法覆盖了D类中的j()方法,但我不能使用 super.j(); - 编译器说: 不能在静态上下文中使用super)。
看起来D.j()不能在代码中从那个地方调用,但我只是想确定。有什么难事吗?

4 个答案:

答案 0 :(得分:2)

只需在main方法中实例化 D 类:

D dd = new D();
dd.j();

答案 1 :(得分:2)

有两种方法可以解决问题 - 两者都需要修改其中一个类。

1。实施/回退方法

您可以在D类中引入“后备”方法,然后可以正常调用。

void j() {
    fallback();
}

void fallback() {
    System.out.println("D");
}

public static void main(String[] args) {
    D d = new D() {
        @Override
        void j() {
            System.out.println("Anonymous!");
        }
    };
    d.j(); // prints 'Anonymous!'
    d.fallback(); // prints 'D'
}

2。匿名类中的助手方法

如果您没有父D类的编辑权限,例如因为它来自库,您可以在匿名类中引入一个调用super实现的方法。 / p>

void j() {
    fallback();
}

void fallback() {
    System.out.println("D");
}

public static void main(String[] args) {
    class AnonD extends D{
        @Override
        void j() {
            System.out.println("Anonymous!");
        }

        void superJ() {
            super.j();
        }
    }
    AnonD d = new AnonD();
    d.j(); // prints 'Anonymous!'
    d.superJ(); // prints 'D'
}

这有一个小缺点,你需要命名你的匿名类。您不必将它作为顶级类声明,因为您也可以在本地声明它所使用的方法。

答案 2 :(得分:1)

问题是您在非静态上下文中创建了方法j()

一个可行的解决方案是通过添加“静态”来使j()静态化。 j前面的关键字,如下:

static void j(){...}

现在,您可以在指定的错误中访问“静态上下文”中的j()

答案 3 :(得分:1)

您不能在静态上下文中使用非静态内容。

thissuper - 非静态事物,它们不存在于静态上下文中

您需要初始化对象D,然后通过引用调用j()方法:

new D().j();

我认为这有助于你弄明白:

class D {
    public static void main(String[] args) {
        // static context
        D a = new D() {
            // only non-static methods and fields
            @Override
            void j() {
                // non-static context - possible to use  'super' and 'this' keywords
            }
        };
    }

    void j() {
        // non-static context - possible to use  'super' and 'this' keywords
    }
}