йно, неоднозначний: в одних ситуаціях - конструкторами, в інших - блоками ініціалізації. Для додання початкових значень змінним класу у випадках, коли для цього потрібні складні алгоритми, можна користуватися тільки статичними блоками ініціалізації. Для ініціалізації полів об'єктів у загальному випадку краще користуватися конструкторами, але якщо необхідно виконати якийсь код ініціалізації до виклику успадкованого конструктора, можна скористатися блоком динамічної ініціалізації. p align="justify"> Наведемо кілька прикладів. Програма SmallSquares (маленькі квадрати) повертає квадрат маленького цілого числа. SmallSquares має дві статичні змінні і єдину відкриту статичну функцію getSquare (). br/>
public class SmallSquares {static final int LIMIT = 10; static final int [] square = new int [LIMIT]; SmallSquares () {(int i = 0; i
}
}
} static int getSquare (int i) {square [i];
} static void main (String [] args) {SmallSquares ();. out.println ("3 squared is" +
getSquare (3));
}
}
Відкомпілювати і запустивши SmallSquares, отримаємо наступний результат:
squared is 9 (3 в квадраті буде 9)
У даному коді об'єкт створюється за допомогою конструктора так званим статичним методом. p align="justify"> Наведемо приклад статичної ініціалізації. За словом статичний (static) йде блок коду, оточеного фігурними дужками. Можна використовувати статичний блок для ініціалізації масиву квадратів наступним чином:
static {(int i = 0; i
square [i] = i * i;
}
}
Статичний блок запитується тільки один раз під час створення класу. Тепер не потрібен конструктор, і можна викликати статичну функцію getSquare () без попереднього створення класу. Покращений код виглядає наступним чином:
public class SmallSquares {static final int LIMIT = 10; static final int [] square = new int [LIMIT]; {(int i = 0; i
}
} static int getSquare (int i) {
// Ні обробки помилки, припустимо, 0 <= i
return square [i];
} static void main (String [] args) {. out.println ("3 squared is" + getSquare (3));
}
}
Наведемо приклад застосування блоку динамічної ініціалізації. Код в програмі, ConstructorExample (приклад конструктора), знову ініціалізує масив цілих чисел. Існує дві версії конструктора. Перша - конструктор без аргументу, який за замовчуванням визначає значення "Безіменний" ("Anonymous"). У другій версії є один аргумент: значення ім'я користувача (userName). Конструктори об'єднані, так як квадрат повинен ініціалізуватися в кожному випадку. p align="justify"> public class ConstructorExample {final String userName; final static int [] square = new int [10]; ConstructorExample () {("Anonymous");
} ConstructorExample (String userName) {. userName = userName; (int i = 0; i <10; i + +) {[i] = i * i;
}
} void printSquare (int i) {
// no error handling - assume 0 <= i
} static void main (String [] args) {ConstructorExample (). printSquare (3); ConstructorExample ("Ed"). printSquare (5);
}
}
Відкомпілюємо і запустимо ConstructorExample. У результаті отримаємо наступний результат:
Anonymous (привіт Безіменний)
squared is 9 (3 в квадраті буде 9) Ed (Привіт Ед)
squared is 25 (5 в квадраті буде 25)
У наведеному вище прикладі квадрат инициализируется неправильно залежно від того, чи викликає користувач конструктор без аргументу або використовує сигнатуру, що вимагає рядок (String). Приклад конструктора можна привести в порядок, перемістивши поле ініціалізатора для імені користувача (userName) і ввівши наступний блок ініціалізатора:
{(int i = 0; i <10; i + +) {[i] = i * i;
}
}
Даний блок ініціалізаторів виглядає як блок статичного ініціалізатора без статичного ключового слова. Він запускається перед тим, як викликати конструктор. p align="justify"> Можна розділити конструктори в прикладі (ConstructorExample), пересунувши наступні рядки від констр...