Java:如何从静态嵌套类引用外部类的非静态字段?

时间:2011-11-26 21:36:09

标签: java static-members nested-class zk

有没有办法从静态嵌套类引用外部类的非静态字段?

请参阅下面的代码:

public class TestComponent {
    String value;

    public void initialize(String value) {
        this.value = value;
    }

    public static class TestLabel extends GenericForwardComposer {
        Label testLabel;
        @Override
        public void doAfterCompose(Component comp) throws Exception {
            super.doAfterCompose(comp);
            testLabel.setValue(value);
        }
    }
}

此代码在testLabel.setValue(value)处抛出错误,因为我试图对非静态字段进行静态引用。但是,我需要将值设置为非静态,并在静态嵌套类的方法中引用它。我该怎么做?

您可能会注意到我在这里实例化TestComponent.java:http://top.cs.vt.edu/~vsony7/patches/gfc.patch

我们的想法是使用两个不同的值“Label 1”和“Label 2”动态创建两个标签,并将它们附加到两个不同的组件,即vlayout1和vlayout2。但是,当我运行此代码时,标签会附加到每个布局,但两个标签的值都是“标签2”。您可以在以下位置进行测试:

问题在于,两个调用IncludeBuilder创建的testlabel.zul窗口共享静态类TestLabel。在super.doAfterCompoe()之后,两个调用中test label的值都设置为“Label 2”。

我使用的是Zk框架,而ZK没有封闭的实例,所以内部嵌套类TestLabel必须是静态的。

谢谢, 索尼

2 个答案:

答案 0 :(得分:2)

内部静态类在没有对象引用的情况下无法访问封闭类的成员变量。内部静态类就像顶级静态类一样,只是打包在类中。

Nested classes tutorial.

您最好的选择可能是构造一个将实例value作为参数传递的实例,或者将其作为参数调用方法。

答案 1 :(得分:2)

内部类不能是静态的,因为它可以工作。它需要访问TestComponent的封闭实例才能引用value。删除静态修改器。