Как этот код компилируется, хотя мы используем константу, которая будет определена позже? - PullRequest
4 голосов
/ 21 марта 2010

В следующем коде DEFAULT_CACHE_SIZE объявлен позже, но он используется для присвоения значения переменной String до этого, поэтому было любопытно, как это возможно?

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 ]

8 голосов
/ 21 марта 2010

С Sun docs :

Статический модификатор в сочетании с модификатором final также используется для определения констант. Последний модификатор указывает, что значение этого поля не может измениться.

Если примитивный тип или строка определены как константа, а значение известно во время компиляции, компилятор заменяет имя константы везде в коде на его значение. Это называется константа времени компиляции

В вашем коде DEFAULT_CACHE_SIZE - это константа времени компиляции.

4 голосов
/ 21 марта 2010

Статические свойства класса всегда разрешаются сразу после загрузки класса, что, очевидно, происходит до создания экземпляра класса для объекта.

В отличие, например, от C ++, где все должно быть объявлено в источнике перед использованием, в Java фактический порядок конструкторов, полей и методов не влияет на порядок и время оценки различных свойств класса.

0 голосов
/ 22 марта 2010

Он не используется «до», он определен.Назначение может быть в строке выше в источнике, но это не имеет значения - javac читает весь исходный файл и затем начинает генерировать код.(Вот так он может определять такие вещи, как «закрытая переменная никогда не использовалась» и т. Д.) Другими словами, порядок операторов имеет значение для определения того, какие операторы в последовательности выполняются первыми, но соседние элементы класса не имеют «порядок«такого рода среди них.

Однако есть правила для статических / нестатических элементов, и они гарантируют, что значение будет доступно после загрузки класса и до создания экземпляра объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...