Використання ключового слова static. Статичні члени даних класу. Статичні методи класу
Зміст
- 1. Для чого у класах використовуються статичні члени даних? Особливості використання статичних членів даних
- 2. Як оголосити статичний член даних? Ключове слово static
- 3. Приклад, що демонструє спільний доступ до статичного члена з різних об’єктів класу а також використання статичного методу у класі
- 4. Яка загальна форма оголошення статичного методу в класі?
- 5. Які обмеження накладаються на статичні методи?
- 6. Чи можна використовувати об’єкт класу з статичним членом даних у нестатичному методі класу?
- 7. Чи можуть статичні змінні оголошуватись як приховані з ключовим словом private?
- 8. Що таке статичний блок класу? Для чого використовується статичний блок класу?
- 9. Приклад класу, в якому здійснюється ініціалізація статичної змінної різними способами
- 10. Як доступитись до статичного методу (змінної) за межами його класу? Як викликати статичний метод (змінну) використовуючи ім’я класу, в якому він реалізований. Приклад
- Зв’язані теми
Пошук на інших ресурсах:
1. Для чого у класах використовуються статичні члени даних? Особливості використання статичних членів даних
Статичні члени класу – це є особливі члени даних класу. Вони близькі до глобальних змінних. Статичні члени даних використовуються у класах у випадках, коли потрібно використовувати деякі дані незалежно від будь-якого об’єкту цього класу.
Для оголошеного класу можна оголошувати будь-яку кількість об’єктів цього класу. Статичний член класу є спільним (одним) членом даних для усіх об’єктів цього класу. Статичний член класу є доступний незалежно від того, чи на даний момент створено об’єкт цього класу чи ні.
Якщо у класі член даних оголошено як статичний, то він є доступний до моменту створення будь-яких об’єктів цього класу а також є доступний без використання посилання на будь-який об’єкт.
Фактично, оголошення класу є єдиним у всій програмі. Об’єктів (екземплярів) класу може бути декілька. Статичний член класу, як і оголошення класу є тільки один, спільний для усіх об’єктів.
⇑
2. Як оголосити статичний член даних? Ключове слово static
Статичний член даних оголошується з допомогою ключового слова static. В загальному, оголошення статичного члена даних у класі має вигляд:
class StaticClass { ... static type data_member; ... }
⇑
3. Приклад, що демонструє спільний доступ до статичного члена з різних об’єктів класу а також використання статичного методу у класі
У прикладі оголошується клас з іменем DemoStatic. У класі оголошується дві змінні-екземпляри класу або члени даних класу:
- статична змінна (статичний член даних) класу з іменем sd;
- внутрішня змінна класу з іменем d.
Також у класі оголошуються методи:
- конструктор класу, що ініціалізує значення внутрішніх змінних класу;
- методи доступу до статичного члена даних GetSd(), SetSD();
- методи доступу до нестатичного члена даних GetD(), SetD();
- статичний метод DemoMethod(), що демонструє використання статичного члена даних sd;
- статичний метод main(), що є точкою входу в програму.
Лістинг класу наступний:
// Використання класу, що містить статичний член даних public class DemoStatic { static int sd; // статичний член даних - спільний для усіх об'єктів класу int d; // нестатичний член даних // конструктор DemoStatic() { sd = 0; d = 0; } // методи доступу int GetSd() { return sd; } int GetD() { return d; } void SetSd(int nsd) { sd = nsd; } void SedD(int nd) { d = nd; } // статичний метод, що демонструє використання статичного члена даних static void DemoMethod() { // оголошення об'єктів класу DemoStatic d1 = new DemoStatic(); DemoStatic d2 = new DemoStatic(); DemoStatic d3 = new DemoStatic(); int t; // додаткова змінна t = d1.GetD(); // t = 0 t = d1.GetSd(); // t = 0 // зміна статичного члену даних d1.SetSd(5); t = d2.GetSd(); // t = 5 - статичний член даних є спільним для об'єктів d1, d2, d3 t = d3.GetSd(); // t = 5 - так само // зміна нестатичного члену даних d1.SedD(8); t = d2.GetD(); // t = 0 System.out.println(t); } public static void main(String[] args) { DemoMethod(); } }
⇑
4. Яка загальна форма оголошення статичного методу в класі?
Так само як і статичний член даних класу, статичний метод в класі оголошується з допомогою ключового слова static.
У найпростішому випадку оголошення класу зі статичним методом має такий загальний вигляд:
class StaticClass { // ... static type StaticMethod(parameters) { // ... } // ... }
де
- StaticClass – ім’я класу, в якому оголошується статичний метод;
- StaticMethod() – статичний метод.
⇑
5. Які обмеження накладаються на статичні методи?
На статичні методи, що оголошені в деякому класі, накладаються наступні вимоги:
- статичні методи можуть викликати тільки інші статичні методи;
- статичні методи мають доступ тільки до статичних змінних. До нестатичних змінних класу статичні методи доступу не мають;
- статичні методи не можуть посилатись на посилання this класу;
- статичні методи не можуть використовувати посилання типу super.
⇑
6. Чи можна використовувати об’єкт класу у нестатичному методі класу, якщо у класі цього об’єкта оголошується статичний член даних?
Ні. Якщо клас оголошує статичний член даних, то оголосити об’єкт цього класу у нестатичному методі класу не можна. У цьому випадку компілятор видасть помилку
Cannot make a static reference to the non-static method DemoMethod() from the type DemoStatic
де
- DemoMethod() – нестатичний метод;
- DemoStatic – статичний клас.
Така реакція компілятора є логічною, оскільки, нестатичний метод класу і статичний член даних належать до різних класів пам’яті. Використовувати об’єкт класу зі статичним членом даних можна тільки у статичному методі.
⇑
7. Чи можуть статичні змінні оголошуватись як приховані з ключовим словом private?
Так, можуть. У прикладі в п. 3 статичний член класу можна оголошувати так:
private static int sd; // статичний член даних, оголошений як private
⇑
8. Що таке статичний блок класу? Для чого використовується статичний блок класу?
Статичний блок класу має такий загальний вигляд:
static { // тіло блоку // ... }
Статичний блок класу використовується для ініціалізації
⇑
9. Приклад класу, в якому здійснюється ініціалізація статичної змінної різними способами
Спосіб 1. З допомогою оператора присвоєння ‘=’.
// ініціалізація статичного члену даних класу - спосіб 1 public class InitStatic { static double sd=2.85; // ініціалізація статичного члена public static void main(String[] args) { // TODO Auto-generated method stub InitStatic s1 = new InitStatic(); // викликається конструктор double x; x = s1.sd; // x = 2.85 x = sd; // x = 2.85 System.out.println(x); } }
Спосіб 2. З допомогою конструктора.
// ініціалізація статичного члену даних класу - спосіб 2 public class InitStatic { static double sd; // ініціалізація з допомогою конструктора InitStatic() { sd = -8.893; } public static void main(String[] args) { // TODO Auto-generated method stub InitStatic s1 = new InitStatic(); // викликається конструктор double x; x = s1.sd; // x = -8.893 x = sd; // x = -8.893 System.out.println(x); } }
Спосіб 3. Ініціалізація з допомогою статичного блоку.
// ініціалізація статичного члену даних класу - спосіб 3 public class InitStatic { static double sd; // ініціалізація статичного члена // ініціалізація з допомогою статичного блоку static { sd = -100.0; } public static void main(String[] args) { // TODO Auto-generated method stub InitStatic s1 = new InitStatic(); // викликається конструктор double x; x = s1.sd; // x = -100.0 x = sd; // x = -100.0 System.out.println(x); } }
⇑
10. Як доступитись до статичного методу (змінної) за межами його класу? Як викликати статичний метод (змінну) використовуючи ім’я класу, в якому він реалізований. Приклад
Щоб викликати статичний метод за межами класу, в якому він оголошений, використовується наступна форма:
ClassName.StaticMethod()
де
- ClassName – ім’я класу, в якому оголошений статичний метод;
- StaticMethod() – ім’я статичного методу.
Щоб викликати статичну змінну за межами класу, в якому вона оголошена використовується така сама форма:
ClassName.StaticVariable
де
- ClassName – ім’я класу, в якому оголошена статична змінна;
- StaticVariable – ім’я статичної змінної.
Приклад. У нижченаведеному прикладі оголошується 2 класи з іменами A та B. У класі A реалізована статична змінна та статичний метод. Демонструється виклик статичних змінної та методу класу B з класу A.
Реалізація класу B:
public class B { static int b; // статична змінна // статичний блок ініціалізації змінної b static { b = 13; } // статичний метод static int GetB() { return b; } }
Реалізація класу A:
public class A { // статична змінна static int a; // конструктор класу A() { a = 5; } // статичний метод static int GetA() { return a; } public static void main(String[] args) { // TODO Auto-generated method stub // доступ до статичної змінної за іменем класу A A.a = 8; int t; // доступ до статичного методу класу A t = A.GetA(); // t = 8 // доступ до статичної змінної класу B t = B.b; // t = 13 - змінна ініціалізована з допомогою статичного блоку класу B B.b = 33; t = B.b; // t = 33 // доступ до статичного методу класу B t = B.GetB(); // t = 33 System.out.println(t); } }
⇑
Зв’язані теми
- Застосування класів у програмах на Java. Визначення класу та об’єкту класу. Приклади
- Конструктори. Параметризовані конструктори. Ключове слово this. Збір “сміття”. Метод finalize(). Приклади
- Перевантаження методів у класах. Перевантаження конструкторів