2013-04-06 3 views

ответ

11

Это будет иногда - это зависит от того, является ли переменная фактически константа:

  • Он должен быть строкой или примитивной переменной (возможно любого другого класса с нулевое значение, я должен был бы проверить)
  • выражение инициализации должно быть постоянным выражением

Если это так, любые ссылки на переменную эффективно преобразуются в значение. Так что в этом коде:

class Foo { 
    public static final int BAR = 5; 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

Метод в Baz компилируется в тот же код, как:

public static void quux() { 
    System.out.println(5); 
} 

Там нет ни намека на Foo.BAR оставил в байткод, поэтому Foo не нужно инициализировать когда метод выполняется.

Если вы хотите, чтобы это не происходило, вы всегда просто не инициализируетесь постоянным выражением в переменном инициализаторе. Например:

class Foo { 
    public static final int BAR; 

    static { 
     BAR = 5; 
    } 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

Это было бы достаточно, чтобы сделать Foo.BAR не считается постоянным, насколько компилятор обеспокоен.