План
1 Статичні елементи
2 Ключові слова thisі super
3 Ключове слово abstract
4 Інтерфейси
1 Статичні елементи
До цього моменту під полями об'єкту ми завжди розуміли значення, які мають сенс тільки в контексті деякого екземпляра класу. Наприклад:
class Human {
private String name;
}
Перш ніж звернутися до поля name, необхідно отримати посилання на екземпляр класу Human.
Але бувають дані іншого характеру. Припустимо, необхідно зберігати кількість всіх людей (примірників класу Human, існуючих у системі). Зрозуміло, що загальна кількість людей не є характеристикою якоїсь однієї людини, вона відноситься до всього типу в цілому. Звідси з'являється назва «поле класу», на відміну від «поля об'єкта». Оголошуються такі поля за допомогою модифікатора static:
class Human {
public static int totalCount;
}
Щоб звернутися до такого поля, посилання на об'єкт не потрібно, цілком достатньо імені класу. Але для зручності дозволено звертатися до статичних полів і через посилання:
Human h = new Human ();
h.totalCount = 100;
Однак таке звернення конвертується компілятором.
Статичні поля також можуть бути оголошені як final, це означає, що вони повинні бути проініціалізовані суворо один раз і потім вже більше не змінювати свого значення. Аналогічно, статичні методи можуть бути оголошені як final, а це означає, що їх не можна перекривати в класах-спадкоємцях.
Для ініціалізації статичних полів можна користуватися статичними методами й не можна звертатися до динамічних. Вводять спеціальні поняття - статичний і динамічний контексти. До статичному контексту відносять статичні методи, статичні ініціалізатори, ініціалізатори статичних полів. Всі інші частини коду мають динамічний контекст.
При виконанні коду в динамічному контексті завжди є об'єкт, з яким йде робота в даний момент. Наприклад, для динамічного методу це об'єкт, у якого він був викликаний, і так далі.
Навпаки, зі статичним контекстом асоційованих об'єктів немає. Наприклад, як вже вказувалося, стартовий метод main() викликається в тої момент, коли жоден об'єкт ще не створений. При зверненні до статичного методу, наприклад, MyClass.staticMethod(), також може не бути жодного примірника MyClass. Звертатися до статичних методів класу Math можна, а створювати його екземпляри ні.
А раз немає асоційованих об'єктів, то й користуватися динамічними конструкціями не можна. Можна тільки посилатися на статичні поля й викликати статичні методи. Або звертатися до об'єктів через посилання на них, отримані в результаті виклику конструктора або як аргумент методу і т.п.