Java 即使我们使用了稍后定义的常量,代码是如何编译的?

Java 即使我们使用了稍后定义的常量,代码是如何编译的?,java,Java,在下面的代码中,默认的\u缓存\u大小是在后面声明的,但是在声明之前它被用来为字符串变量赋值,所以我们很好奇这是怎么可能的 public class Test { public String getName() { return this.name; } public int getCacheSize() { return this.cacheSize; } public synchronized void setCacheSize(int size) { this.cac

在下面的代码中,默认的\u缓存\u大小是在后面声明的,但是在声明之前它被用来为字符串变量赋值,所以我们很好奇这是怎么可能的

public class Test  { 

public String getName() { 
return this.name; 
} 

public int getCacheSize() { 
return this.cacheSize; 
} 

public synchronized void setCacheSize(int size) {
this.cacheSize = size; 

System.out.println("Cache size now " + this.cacheSize); 
} 

private final String name = "Reginald"; 
private int cacheSize = DEFAULT_CACHE_SIZE; 
private static final int DEFAULT_CACHE_SIZE = 200; 
}

类的静态属性总是在类加载后立即解析,这显然是在类被实例化为对象之前发生的事情

不同于C++,在使用之前,所有的内容都必须在源代码中声明,在java中,构造函数、字段和方法的实际顺序对类的各种属性的评价顺序和时间没有影响。 “静态”修改器与“最终”修改器一起还用于定义常量。最后一个修饰符指示此字段的值不能更改

如果原语类型或字符串被定义为常量,并且该值在编译时是已知的,则编译器会用其值替换代码中所有地方的常量名称。这称为编译时常量


在您的代码中,默认的缓存大小是一个编译时常量。

在定义之前不使用它。赋值可能在源代码中较高的一行,但这与此无关-
javac
读取整个源文件,然后开始生成代码。(这就是它如何确定“从未使用过的私有变量”等)换句话说,语句的顺序决定了序列中哪些语句首先执行,但类的相邻元素之间没有这种“顺序”


但是,有关于静态/非静态元素的规则,这些规则保证在类加载之后和对象实例化之前该值可用。

True,但不相关。静态final在编译时解析-参见codaddict的答案。