代码之家  ›  专栏  ›  技术社区  ›  GuruKulki

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

  •  4
  • GuruKulki  · 技术社区  · 15 年前

    在下面的代码中,default_cache_size是稍后声明的,但它用于在这之前为字符串变量赋值,所以很好奇它是怎么可能的?

    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; 
    }
    
    3 回复  |  直到 15 年前
        1
  •  8
  •   codaddict    15 年前

    Sun docs :

    静态修饰符与最终修饰符一起也用于定义常量。最后一个修饰符表示此字段的值不能更改。

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

    在您的代码中 DEFAULT_CACHE_SIZE 是编译时常量。

        2
  •  4
  •   Esko    15 年前

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

    与C++中不同的是,在使用之前,所有的内容都必须在源代码中声明,在Java中,构造函数、字段和方法的实际顺序对类的各种属性的评估顺序和时间没有影响。

        3
  •  0
  •   Kilian Foth    15 年前

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

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