java - Java 中静态和非静态前向引用的内部工作

标签 java static non-static forward-reference

我正在使用 Java 中的前向引用,想知道为什么 Java 允许使用 ClassName(在静态变量中)或使用 this 引用(在实例变量的情况下)进行前向引用? 在 JVM 级别发生的后台进程是什么?例如:

静态前向引用-

class StaticForwardReferences {
    static {
        sf1 = 10;   // (1)
        int b = sf1 = 20;   // (2)
        int c = StaticForwardReferences.sf1; // (3) Works fine
        // Above statement allows the allocation of value of 'sf1'
        // to variable 'c' just because it is accessed with class name
        // instead of direct name

        // whereas below statement throws illegal forward reference
        // error at compile time
        System.out.println(sf1); // (4) Illegal forward reference
    }
    static int sf1 = sf2 = 30;
    static int sf2;

    public static void main(String[] args) {}
}

如果我们打印变量的值 c,它显示最近分配给 sf1 的值。

非静态前向引用-

class NonStaticForwardReferences {
    {
        nsf1 = 10;
        System.out.println(this.nsf1);  // 10
        nsf1 = sf1;
        // System.out.println(nsf1); Illegal forward reference
        int b = nsf1 = 20;

        int c = this.nsf1;
        System.out.println(c);  // 20
        // why variable 'c' is initialized to 20 when used with 'this' reference
        // instead of showing illegal forward reference, how it works in the background?
   }

   int nsf1 = nsf2 = 30;
   int nsf2;
   static int sf1 = 5;

   public static void main(String[] args) {}
}

请阐明上述两种情况在幕后发生的后台进程。提前致谢! :)

最佳答案

JLS, Section 8.3.3 , 说明了对静态变量(“类变量”)进行前向引用的条件是编译器错误,尽管它没有说明原因。

Use of class variables whose declarations appear textually after the use is sometimes restricted, even though these class variables are in scope (§6.3). Specifically, it is a compile-time error if all of the following are true:

  • The declaration of a class variable in a class or interface C appears textually after a use of the class variable;

  • The use is a simple name in either a class variable initializer of C or a static initializer of C;

  • The use is not on the left hand side of an assignment;

  • C is the innermost class or interface enclosing the use.

(斜体 强调我的)

出现实例变量前向引用错误的情况类似:

Use of instance variables whose declarations appear textually after the use is sometimes restricted, even though these instance variables are in scope. Specifically, it is a compile-time error if all of the following are true:

  • The declaration of an instance variable in a class or interface C appears textually after a use of the instance variable;

  • The use is a simple name in either an instance variable initializer of C or an instance initializer of C;

  • The use is not on the left hand side of an assignment;

  • C is the innermost class or interface enclosing the use.

(斜体 强调我的)

在这两种情况下,使用简单名称 是这里的关键条件。这意味着使用不带任何限定符(如 this 或类名)的变量。这就是 this.nsf1NonStaticForwardReferences 中工作的原因。如果删除 this,则会发生错误。这也是sf1有错误而StaticForwardReferences.sf1;没有错误的原因。

关于java - Java 中静态和非静态前向引用的内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48065649/

相关文章:

java - 如何在java中读取docker-compose.yml文件

java - Java 中的稀疏矩阵乘法

java - 使用 XPath 循环 XML 字符串 - Java

actionscript-3 - AS3 从静态方法中获取当前类名

java - 在 java 中,System.out.println 方法如何在静态和非静态上下文中工作?

java - 非静态变量 this 不能在 Java 的静态上下文中引用

java - java中如何通过父类(super class)实例调用子类方法?

Java 静态变量和继承与内存

c# - 替换文本字符串时出现奇怪的 C# 错误

java - java中如何访问非静态私有(private)字段?