21

Re: Розуміння ключового слова Static в Java

А як бути з, наприклад, кількістю котів? Це не властивість кожного з котів, скоріше це властивість всіх котів, разом взятих — властивість поняття, властивість класу. От для таких властивостей і методів і використовують static.

простий підрахунок ссилок маєте на увазі?

Я так розумію, що quez мав на увазі поле - лічильник створених котів. Тобто кожен кіт при створенні оновлює поле лічильника, і це поле є статік, тобто загальне для цілого класу. Випадок з лічильником дуже добре ілюструє статичне поле.

Подякували: quez1

22 Востаннє редагувалося Regen (16.02.2015 10:53:43)

Re: Розуміння ключового слова Static в Java

quez написав:
Regen написав:
quez написав:

Ні, до чого тут підрахунок ссилок?

до кількості котів і статичного поля) хоча, забийте, ми ж типу хіба про об'єкти і класи говоримо

Все одно не бачу зв’язку між кількістю екземплярів та підрахунком ссилок.

щойно побачив, кількість ссилок>=кількість екземплярів
правда до підрахунку бракує декременту поля при видаленні об'єктів
а так до нічого) просто аналогія

23

Re: Розуміння ключового слова Static в Java

static - це тип.

24

Re: Розуміння ключового слова Static в Java

jkzrna192 написав:

static - це тип.

ні :)

Коротко, static це ключове слово для створення властивостей й методів, що належать класам.

Static перед властивостями класів, у Java головним чином використовується для керування пам'яттю.

Приклад:

class Cat {
  String name;
  int year;
  void sayYear() {System.out.println(this.year);
}

Створюючи екземпляр такого класу:

Cat myCat = new Cat();

Java виділяє пам'ять під String name та int year для нашого новоствореного myCat.
Для ще одного кота,

Cat myCat1 = new Cat();

, ще String name та int year і так далі.

Натомість, модифікатор static застосований до властивостей класу, передає їх у власність класу і щоб дістатися до їх значення, не потрібно створювати об'єкт (бо вони належать класу). Пам'ять під такі змінні виділяється одразу після завантаження класу до джава-машини, та не пере-виділяється при створенні екземпляру класу. Тобто для класу

class CatStatic {
  String name;
  static int year;
  void sayYear() {System.out.println(CatStatic.year);
}

Java одразу й ОДИН раз виріляє пам'ять під int year, a
при створенні котиків

Cat myCat = new Cat();

Java виділяє пам'ять тільки під String name, а також до значення year можна дістатися в такий спосіб:

CatStatic.year = 5;
System.out.println(CarStatic.year); // 5

.

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

myCat.sayYear(); // 5
CatStatic.year = 25;
Cat newMyCat = new Cat(); // виділилася пам'ять тільки під String name
newMyCat.sayYear(); // 25
Подякували: Replace1

25

Re: Розуміння ключового слова Static в Java

У справі статичних методів - все простіше. Як й писав, static "передає" у власність свою ціль до класу, отже статичний метод належить класу:

class Test {
   static void testStatic() {};
}
Test::testStatic(); // ok
new Test().testStatic(); // bad

а не об'єкту.

Подякували: Replace1

26

Re: Розуміння ключового слова Static в Java

Інші застосування static.

Static init block:
В джаві існують блоки ініціалізації, які дозволяються додатково ініціалізувати клас / об'єкті. У контексті static - клас. Виглядає наступним чином:

class StaticIntTest {
  static int testVariable = 5;

  static {
     System.out.println(testVariable); // 5
  }

  public StaticIntTest() {
     System.out.println("Constructor call");
  }
}

Все що знаходиться у такому блоку, буде виконане одразу після завантаження класу до джава-машини та ініціалізації статичних змінних у класі. Тобто:

import StaticIntTest; // Java завантажила класс, встановила змінній testVariable значення 5 і вивела на екран.
StaticIntTest test = new StaticIntTest(); // новий об'єкт.

має такий результат:

5
Constructor call

Використовується для "до"-ініціалізації класів та виконання допоміжних статичних методів. Найбільш поширений приклад - клас, що працює з базою, може у таких блоках завантажувати додаткові бібліотеки/драйвери тощо.

Static nested class
Модифікатор static також може застосовуватися до вкладених класів. Виконує ту ж саму функцію - передача власності до класу. Об'єкти статичних вкладених класів можуть бути створені без створення об'єктів його батьківського класу:

class Parent {
   static class ChildStatic {}
   class Child();
}

new Parent.ChildStatic(); // ok
new Parent.Child(); // error, child не належить класу
Parent obj = new Parent();
Parent.Child childObj = obj.new Child(); // ok, child належить об'єкту obj
Подякували: Replace1

27

Re: Розуміння ключового слова Static в Java

Нагадайте якщо щось забув :)