当前位置: 首页 > 面试题库 >

静态最终字段的非法前向引用错误

邰德业
2023-03-14
问题内容

我试图编译其中一个Java类javac与拒绝 非法向前引用 错误,其中有问题的参考是词汇 的基准场。在显示相同行为时,将尽可能精简以下类:

java.util.concurrent.Callable并且的许多用途Object仅用作占位符,以删除不相关的代码段。

public class Test {
    static final Object foo = method(new java.util.concurrent.Callable<Object>() {
        @Override
        public Object call() throws Exception {
            return bar;
        }
    });

    static final Object bar = foo;

    static Object method(Object binder) {
        return null;
    }
}

使用编译时javac Test.java,javac会显示以下错误消息:

Test.java:9: illegal forward reference
    static final Object bar = foo;
                              ^

因此,编译器抱怨bar的声明引用,foofoo应在bar的声明范围内。但是,一旦删除了barin
foo的声明的引用(例如,通过将第5行从更改return bar;为)return null;,编译器将接受该类。

如何解释呢?我对 前锋的 理解是错误 之后的词汇 意义 还是我不知道的某些特殊情况?


问题答案:

您对 前瞻性参考的 理解是正确的。第foo9行上的引用根本不是 前向引用
,因为它在声明之前不会在文本上出现(请参阅Java语言规范
8.3.2.3节中对构成 前向引用
的定义)。

您观察到的行为是javac 错误
的症状。请参阅此错误报告。该问题似乎已在较新版本的编译器(例如OpenJDK
7)中得到解决。

它仅影响用作 最终* 字段初始化器的 前向引用 。该问题似乎同样影响静态和非静态字段。 *

请注意,对barin 的引用call()是合法的 正向引用,
因为它发生在不同的类内部(请参见Java语言规范
8.3.2.3节中的示例)。

另外,请注意,以下每个更改都会使错误消失:

使bar非决赛:

static Object bar = foo;

初始化bar静态或实例初始化块:

static final Object bar;

static {
  bar = foo;
}

将初始化foo移至初始化程序块也有帮助。

bar从非最终临时参考中初始化foo

static Object tmp = foo;
static final Object bar = tmp;

barTest.foo(由Tom Anderson找到)或this.foo在非静态情况下初始化:

static final Object bar = Test.foo;

bar使用fooinside 移除并引用该对象call()

static final Object foo = method(new java.util.concurrent.Callable<Object>() {
    @Override
    public Object call() throws Exception {
        return foo;
    }   
});


 类似资料:
  • 问题内容: 我正在学习Java。我编写了以下代码,但是当我尝试输入时,我在Arrayfunction()中收到此错误“无法对非静态输入字段进行静态引用”。为什么会这样,我该如何解决? } 问题答案: 扫描仪未定义为静态,因此在错误的范围内 在内部创建Scanner实例, 或使用以下方法创建扫描仪

  • 我有一个私有int数组,我需要以某种方式找到长度,但在静态类下无法做到这一点。我必须保持类的静态,是否可以添加其他方法来将a.length更改为其他方法? 该问题是由a.length引起的。

  • 我们正在开发基于spring boot 2.5.6的支付应用程序。该应用程序托管在docker上,并在Java14上启动。我们创建了一个名为的抽象类,它是,包含两个变量和。所有枚举类都扩展了这个基类,并在其中定义常量。 这个决定是为了定制整个应用程序层中使用的枚举。你可以在下面看到一个例子: 该类在实体层中用作嵌入变量,如下所示: 系统工作得很好,但是发生了一些错误,ShapeEnum的字段。RE

  • 问题内容: 使用JavaDoc,如何在类中引用最终静态字段的值? 我希望在此示例中将其替换为field的值。 问题答案: 你的意思是?

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该

  • 我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?