【问题标题】:Java: how to reference a non-static field of an outer class from a static nested class?Java:如何从静态嵌套类中引用外部类的非静态字段?
【发布时间】:2011-11-26 21:36:09
【问题描述】:

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

请看我下面的代码:

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

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

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

我正在使用 Zk 框架,并且 ZK 没有封闭实例,因此内部嵌套类 TestLabel 必须是静态的。

谢谢, 索尼

【问题讨论】:

  • 我认为没有办法完全按照您的意愿行事。如您所说,加载内部类时尚未实例化该类,因此尚未实例化 value 字段。 TestLabel真的需要是静态的吗?
  • 你的内部类必须是static吗?如果是,你能不能为TestLabel 创建一个构造函数并将value 传递给它?
  • @nicholas.hauschild:请查看我编辑的问题。内部类必须是静态的。此外,TestLabel 类中的每个字段都引用在单独的 zul 文件中创建的 UI 组件。所以,我不认为我可以在内部类中创建“值”字段并在构造函数中设置其值。
  • 是什么创建了TestLabel 的实例?如果您无法将内部类更改为非静态,则需要某种方式将值传递给该实例。

标签: java static-members nested-class zk


【解决方案1】:

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

Nested classes tutorial.

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

【讨论】:

    【解决方案2】:

    内部类不能是静态的。它需要访问TestComponent 的封闭实例以引用value。移除静态修饰符。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多