static члени належать класу замість конкретного екземпляра.
Це означає, що існує тільки один екземпляр static поля [1], навіть якщо ви створюєте мільйон примірників класу або ви його не створюєте. Він буде використовуватися всіма екземплярами.
Оскільки static методи також не належать до певного примірнику, вони не можуть посилатися на члени примірника (як би ви знали, до якого екземпляру класу Hello ви хочете звернутися?). static члени можуть посилатися тільки на static елементи. Члени примірника можуть, звичайно, отримати доступ до static членам.
Зауваження: Звичайно, static члени можуть звертатися до членів примірника через посилання на об'єкт.
[1]: В залежності від характеристик часу виконання він може бути один для ClassLoader або AppDomain або потік, але це не відноситься до точки.
Тому, якщо ви хочете зробити «новий Hello» в будь-якому місці вашого коду: A- в першому сценарії (до зміни, без використання «статичного»), він буде створювати новий годинник кожен раз, коли викликається «новий Hello», Але B- у другому сценарії (після зміни, використовуючи «статичний»), кожен екземпляр «нового Hello» як і раніше буде спільно використовувати початкову і ту ж саму посилання «годинник», яка була створена вперше.
Якщо вам не потрібні «годинник» десь поза основним, це буде працювати так само добре:
static ключове слово означає, що щось (поле, метод або вкладений клас) пов'язано з типом, а не з будь-яким конкретним екземпляром типу. Так, наприклад, один викликає Math.sin (.) Без будь-якого екземпляра класу Math. і ви дійсно не можете створити екземпляр класу Math.
Java, на жаль, дозволяє вам отримати доступ до статичних членам, як якщо б вони були членами примірника, наприклад
Це змушує його виглядати так, як ніби sleep - це метод примірника, але насправді це статичний метод - він завжди змушує поточний потік спати. Найкраще це зробити в коді виклику:
static ключове слово в Java означає, що змінна або функція розподіляються між усіма примірниками цього класу за типом. а не самими об'єктами.
Отже, якщо у вас є змінна: private static int i = 0; І ви збільшуєте його (i ++) в одному примірнику, ця зміна буде відображено в усіх примірниках. Тепер i буду 1 у всіх випадках.
Статичні методи можуть використовуватися без створення екземпляра об'єкту.
Це означає, що вам не потрібно мати екземпляр класу для використання методу. Тому в вашому прикладі ви можете зателефонувати:
Зсередини статичного методу (який належить тільки класу) ви не можете отримати доступ до тих членів, які не є статичними, оскільки їх значення залежать від вашого екземпляра класу. Таким чином, Clock, який є членом примірника, матиме інше значення / посилання для кожного екземпляра вашого класу Hello, і тому ви не можете отримати до нього доступ з статичної частини класу.
Це обговорення досі ігнорував міркування завантажувача класів. Строго кажучи, статичні поля Java розділяються між усіма примірниками класу для даного завантажувача класів.
Основне використання статичних елементів.
Ось як ви можете мати цінності, що розділяються всіма членами класу, без відправки примірника класу Hello в інший клас. І без статики вам не потрібно створювати екземпляр класу.
Ви можете просто викликати статичні значення або методи по імені класу:
Static - це модифікатор без доступу. Ключове слово static належить класу, ніж екземпляр класу. Може використовуватися для приєднання змінної або методу до класу.
Статична ключове слово CAN може використовуватися з:
Клас, вкладений в інший клас
НЕ МОЖЕ використовуватися з:
Клас (не вкладено)
Метод Локальний Внутрішній Клас (Різниця, потім вкладений клас)
Методи внутрішнього класу
Уявіть собі такий приклад, який має змінну примірника з ім'ям count, яка збільшується в конструкторі:
Оскільки змінна екземпляра отримує пам'ять під час створення об'єкта, кожен об'єкт буде мати копію змінної примірника, якщо вона буде збільшена, вона не буде відображати інші об'єкти.
Тепер, якщо ми змінимо рахунок змінної примірника на статичну, тоді програма зробить інший висновок:
В цьому випадку статична змінна отримає пам'ять тільки один раз, якщо який-небудь об'єкт змінить значення статичної змінної, він збереже своє значення.
Статичний з фіналом:
Глобальна змінна, оголошена як остаточна і статична, залишається незмінною для всього виконання. Оскільки, статичні члени зберігаються в пам'яті класів, і вони завантажуються тільки один раз у всьому виконанні. Вони є загальними для всіх об'єктів класу. Якщо ви оголошуєте статичні змінні остаточними, будь-який з об'єктів не може змінити своє значення, оскільки воно є остаточним. Тому змінні, оголошені як final і static, іноді називаються константами. Всі поля інтерфейсів називаються константами, оскільки за замовчуванням вони є остаточними і статичними.
Поле може бути призначена чи класу, або примірнику класу. За замовчуванням поля є змінними примірника. Використовуючи static поле, стає змінною класу, тому є один і тільки один clock. Якщо ви вносите зміни в одне місце, це видно всюди. Змінні примірника змінюються незалежно один від одного.
В Java ключове слово static може просто вважатися таким:
«Незалежно від ставлення або будь-якого конкретного випадку»
Якщо ви думаєте про static таким чином, стає легше зрозуміти її використання в різних контекстах, в яких він зустрічається:
static поле - це поле, яке належить класу, а не будь-якого окремого екземпляру
Статичні методи не використовують ніяких змінних екземпляра класу, в якому вони визначені. Дуже гарне пояснення різниці можна знайти на цій сторінці
Я розробив симпатію до статичних методів (тільки, якщо це можливо) в класах «помічник».
Зухвалому класу не потрібно створювати іншу змінну-член (екземпляр) класу-помічника. Ви просто називаєте методи допоміжного класу. Також допоміжний клас поліпшений, тому що вам більше не потрібен конструктор, і вам не потрібні змінні-члени (екземпляри).
Ймовірно, є й інші переваги.
Ключове слово static використовується для позначення поля або методу як належить самому класу, а не примірнику. Використовуючи ваш код, якщо об'єкт Clock є статичним, всі екземпляри класу Hello будуть спільно використовувати елемент даних даних Clock (поле). Якщо ви зробите його нестатічность, кожен окремий екземпляр Hello може мати унікальне поле «Clock.
Проблема в тому, що ви додали основний метод в свій клас Hello щоб ви могли запустити код. Проблема тут в тому, що основний метод статичний і як такий він не може посилатися на нестатичні поля або методи всередині нього. Ви можете вирішити це двома способами:
- Створіть всі поля та методи статичного класу Hello щоб вони могли посилатися всередині основного методу. Це дійсно недобре (або неправильна причина робить поле і / або метод статичним)
- Створіть екземпляр класу Hello всередині основного методу і отримаєте доступ до всіх його полів і методів, яким вони були призначені в першу чергу.
Для вас це означає наступне зміна вашого коду:
Статич робить член годин членом класу замість члена примірника. Без ключового слова static вам потрібно буде створити екземпляр класу Hello (який має змінну елемента синхронізації) - наприклад
Можете також думати про статичних членах, у яких немає «цього» покажчика. Вони розподіляються між усіма примірниками.
Ще раз пам'ятайте, що є один екземпляр статичного класу для CLASSLOADER.
Тут Main є статичним методом і існують два основних обмеження статичного методу:
- Статичний метод не може використовувати нестатичних елемент даних або безпосередньо звертатися до нестаціонарному методу.
Це і супер можна використовувати в статичному контексті.
Вихід: помилка часу компіляції
Щоб додати до існуючих відповідей, дозвольте мені спробувати із зображенням:
Розуміння статичних концепцій
Статичні змінні Доступ до них можливий тільки в статичних методах, тому, коли ми оголошуємо статичні змінні, методи getter і setter будуть статичними методами
Static methods - це рівень класу, до якого ми можемо отримати доступ, використовуючи ім'я класу
Нижче наведено приклад для статичних змінних: Getters and Setters:
Ключове слово static modifier при використанні в поєднанні зі змінною створить змінну, яка буде існувати незалежно від будь-яких примірників об'єктів, створених з використанням цього класу. Статичні змінні будуть ініційовані тільки один раз, на початку виконання програми, іноді званого запуском програми. Змінні, які використовують ключове слово static modifier, будуть ініційовані спочатку, перш ніж ініціювати будь-які змінні екземпляра. Тільки одна копія статичної змінної буде існувати в системній пам'яті незалежно від кількості примірників класу, який містить цю змінну. Таким чином, статичний код Java означає, що змінна належить класу, а не екземплярам об'єктів, створеним цим класом.
Ключове слово static modifier працює однаково для методів, оголошених як static, тому статичний модифікатор буде використовуватися для створення методів, які повинні існувати незалежно від будь-яких примірників об'єктів, створених з використанням класу. Це знову фіксує метод на місці, тому це єдина копія цього методу, яка буде використовуватися вашим класом і об'єктами цього класу.
Статичні методи не можуть використовувати будь-які змінні екземпляра будь-яких примірників об'єктів, створених з використанням класу, в якому вони визначені, до тих пір, поки не буде створено один з цих примірників об'єктів. Статичні методи повинні приймати всі свої значення даних зі списку входять параметрів, а потім обчислювати щось з цих параметрів без посилання на змінні, які за своєю суттю не є статичними, тому що вони є змінними!
Для статичного методу існують два основних обмеження. Вони є:
1. Статичний метод не може використовувати нестатичних елемент даних або безпосередньо звертатися до нестаціонарному методу.
2. Це і супер не можуть використовуватися в статичному контексті.