2011-11-26 99 views
2

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

请参阅下面我的代码:

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(值)的错误,因为我想做一个静态引用非静态字段。但是,我需要这个值是非静态的,然而在静态嵌套类的方法中引用它。我该怎么做?

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

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

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

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

谢谢, 索尼

+1

我不认为有一种方法可以做到你想要的。正如你所说,当内部类被加载时,类没有被实例化,所以值字段没有被实例化。 TestLabel _really_需要是静态的吗? – Miquel

+0

你的内部类是“静态”吗?如果是这样,你是否可以不为'TestLabel'创建一个构造函数并将'value'传递给它? –

+0

@ nicholas.hauschild:请参阅我编辑的问题。内部类必须是静态的。此外,TestLabel类中的每个字段都指的是在单独的zul文件中创建的UI组件。所以,我不认为我可以在内部类中创建“值”字段并在构造函数中设置它的值。 – sony

回答

2

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

Nested classes tutorial.

你最好的选择可能是构建传递实例的value作为参数的实例,或致电与它的方法作为参数。

2

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