Статичні члени

Клас містить члени двох видів: поля і методи Для кожного з них задається атрибут, що визначає можливості успадкування та доступу (private, protected, public або package) Крім того, кожен з членів при бажанні можна оголосити як static

Для статичного члена створюється лише один екземпляр, загальний для всього класу, замість побудови його копій в кожному обєкті класу У разі статичних змінних (змінних класу), це рівно одна змінна, незалежно від того, скільки обєктів було створено на основі класу (навіть якщо жодного) Зразком може служити поле nextID класу Body у наведеному вище прикладі

Ініціалізація статичних полів класу відбувається до того, як вони використовуються або запускається будь-який з його методів У наступному прикладі метод unset може бути впевнений у тому, що перед використанням змінної UNSET їй було присвоєно значення DoubleNaN:

class Value {

public static double UNSET = doubleNaN

private double V

public void unset() { V = UNSET

}

// ..

}

291 Блоки статичної ініціалізації

Клас також може містити блоки статичної ініціалізації, Які привласнюють значення статичним полях або виконують іншу необхідну роботу Статичний ініціалізатор виявляється найбільш корисним у тих випадках, коли простий ініціалізації в оголошенні поля недостатньо Наприклад, створення статичного масиву часто має виконуватися одночасно з його ініціалізацією в операторах програми Наведемо приклад ініціалізації невеликого масиву з простими числами:

class Primes {

protected static int[] knownPrimes = new int[4]

static {

knownPrimes[0] = 2

for(int i = 1 i &lt knownPrimeslength i++)

knownPrimes[i] = nextPrime()

}

}

Статична ініціалізація усередині класу виконується в порядку зліва направо і зверху вниз Ініціалізатор, або статичний блок, кожній з статичних змінних виконується перед наступним, починаючи від перших рядка вихідного тексту до останньої При цьому можна гарантувати, що масив knownPrimes буде створений до виконання статичного блоку в нашому прикладі

Що відбудеться, якщо статичний ініціалізатор класу X викликає метод класу Y, а статичний ініціалізатор Y, в свою чергу, викликає метод з класу X для завдання своїх статичних величин Подібні циклічні ініціалізації не можуть бути надійно виявлені в процесі компіляції, оскільки в момент компіляції X клас Y може ще не існувати Якщо виникає подібна ситуація, то статичні ініціалізатори X виконуються лише до виклику методу Y Коли Y, в свою чергу, звернеться до методу X, то останній буде виконуватися без завершення статичної ініціалізації Всі статичні поля X, для яких ініціалізація не було виконане, матимуть значення за замовчуванням (false, \ u0000, нуль або null залежно від типу)

У Ініціалізатор статичних полів не повинні викликатися методи, які, згідно з їх оголошенням, можуть призвести до виникнення перевіряються винятків Справа в тому, що ініціалізатори виконуються при завантаженні класу, і програма може бути ще не готова до обробки винятку

Блок статичної ініціалізації може викликати методи, збуджуючі виняток, але лише в тому випадку, якщо він готовий сам перехопити їх усі

292 Статичні методи

Статичні методи викликаються для цілого класу, а не для кожного конкретного обєкта, створеного на його основі Подібні методи також називаються методами класу Статичний метод може виконувати завдання, загальні для всіх обєктів класу, – наприклад, повертати наступний серійний номер (у нашому прикладі з плеєрами) або

небудь в цьому роді

Статичний метод працює лише зі статичними змінними і статичними методами класу Посилання this в цьому випадку не може використовуватися, оскільки не визначено конкретний обєкт, для якого викликається даний метод

За межами класу статичні методи зазвичай викликаються через імя класу, а не через посилання на конкретний обєкт:

prime = PrimesnextPrime()

knownCnt = PrimesknownPrimeslength

Вправа 213

Включіть в клас Vehicle статичний метод, який повертає максимальне значення ідентифікатора, використане на даний момент

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*