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

发布于 2024-12-18 07:56:48 字数 1080 浏览 1 评论 0原文

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

请参阅下面的代码:

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”。您可以在以下位置对此进行测试:

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

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

谢谢, 索尼

Is there a way to refer to a non-static field of an outer class from a static nested class?

Please see my code below:

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);
        }
    }
}

This code throws an error at testLabel.setValue(value) as I am trying to make a static reference to a non-static field. But, I need the value to be non-static and yet reference it in the static nested class's method. How do I do it?

You may notice how I instantiate TestComponent.java here: http://top.cs.vt.edu/~vsony7/patches/gfc.patch

The idea is to create two labels dynamically with two different values "Label 1" and "Label 2" and append them to two different Components i.e. vlayout1 and vlayout2. But, when I run this code, a label gets attached to each of the layouts but the value of both the labels is "Label 2". You can test this at:

The problem is that the two windows from testlabel.zul created by two calls to IncludeBuilder share the static class TestLabel. After the super.doAfterCompoe() the value of test label is set to "Label 2" in both the calls.

I am using Zk framework and ZK does not have an enclosing instance so the inner nested class TestLabel must be static.

Thanks,
Sony

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贱人配狗天长地久 2024-12-25 07:56:48

如果没有对象引用,内部静态类无法访问封闭类的成员变量。内部静态类的作用类似于顶级静态类,只是封装在类中。

嵌套类教程。

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

Inner static classes cannot access member variables of the enclosing class without an object reference. Inner static classes act like top-level static classes, just packaged inside a class.

Nested classes tutorial.

Your best alternative may be to construct an instance passing the instance's value as a parameter, or call a method with it as a parameter.

烂柯人 2024-12-25 07:56:48

内部类不能是静态的才能起作用。它需要访问 TestComponent 的封闭实例才能引用 value。删除 static 修饰符。

The inner class can't be static for this to work. It needs have access to the enclosing instance of TestComponent to reference value. Remove the static modifier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文