what is static keyword java
Цей посібник пояснює статичне ключове слово у Java та його використання у змінних, методах, блоках та класах. Також зазначається різниця між статичними та нестатичними членами:
Java підтримує різні типи оголошень, щоб вказати обсяг і поведінку своїх змінних, методів, класів тощо. Наприклад, ключове слово final, sealed, static тощо. Усі ці оголошення мають певне значення, коли вони використовуються в програмі Java.
Ми вивчимо всі ці ключові слова, продовжуючи цей посібник. Тут ми обговоримо деталі одного з найважливіших ключових слів у Java, тобто 'статичного'.
Що ви дізнаєтесь:
- Статичне ключове слово в Java
- Висновок
Статичне ключове слово в Java
Член у програмі Java може бути оголошений статичним, використовуючи ключове слово “static”, що передує його оголошенню / визначенню. Коли член оголошено статичним, це по суті означає, що член спільно використовується усіма екземплярами класу без копіювання кожного екземпляра.
Таким чином static - це некласовий модифікатор, який використовується в Java і може застосовуватися до таких членів:
- Змінні
- Методи
- Блоки
- Класи (точніше, вкладені класи)
Коли член оголошено статичним, тоді до нього можна отримати доступ без використання об'єкта. Це означає, що перед створенням класу, статичний член є активним і доступним. На відміну від інших нестатичних членів класу, які припиняють своє існування, коли об’єкт класу виходить за межі області дії, статичний член все ще є очевидно активним.
Статична змінна в Java
Змінна-член класу, який оголошений статичним, називається статичною змінною. Його також називають 'змінною класу'. Після того, як змінна оголошена статичною, пам'ять виділяється лише один раз, а не кожен раз, коли інстанціюється клас. Отже, ви можете отримати доступ до статичної змінної без посилання на об'єкт.
Наступна програма Java зображує використання статичних змінних:
class Main { // static variables a and b static int a = 10; static int b; static void printStatic() { a = a /2; b = a; System.out.println('printStatic::Value of a : '+a + ' Value of b : '+b); } public static void main(String() args) { printStatic(); b = a*5; a++; System.out.println('main::Value of a : '+a + ' Value of b : '+b); } }
Вихід:
У наведеній вище програмі ми маємо дві статичні змінні, тобто a і b. Ми модифікуємо ці змінні у функції “printStatic”, а також у “main”. Зверніть увагу, що значення цих статичних змінних зберігаються у функціях, навіть коли область дії функції закінчується. Результат показує значення змінних у двох функціях.
Навіщо нам статичні змінні і де вони корисні?
Статичні змінні найбільш корисні в додатках, які потребують лічильників. Як ви знаєте, лічильники дадуть неправильні значення, якщо вони оголошені як звичайні змінні.
Наприклад, якщо у вас є звичайна змінна, встановлена як лічильник у програмі, яка має клас, скажімо car. Потім кожного разу, коли ми створюємо автомобільний об’єкт, звичайна змінна лічильника буде ініціалізована з кожним екземпляром. Але якщо ми маємо змінну counter як статичну або змінну класу, тоді вона буде ініціалізована лише один раз при створенні класу.
Пізніше, з кожним екземпляром класу, цей лічильник буде збільшено на одиницю. Це на відміну від звичайної змінної, де з кожним екземпляром лічильник буде збільшуватися, але значення лічильника завжди буде 1.
Отже, навіть якщо ви створите сотню об'єктів автомобіля класу, тоді лічильник як звичайна змінна завжди матиме значення 1, тоді як, при статичній змінній, він покаже правильний рахунок 100.
Нижче наведено ще один приклад статичних лічильників у Java:
class Counter { static int count=0;//will get memory only once and retain its value Counter() { count++;//incrementing the value of static variable System.out.println(count); } } class Main { public static void main(String args()) { System.out.println('Values of static counter:'); Counter c1=new Counter(); Counter c2=new Counter(); Counter c3=new Counter(); } }
Вихід:
Робота статичної змінної видно з наведеної програми. Ми оголосили кількість статичних змінних з початковим значенням = 0. Потім у конструкторі класу ми збільшуємо статичну змінну.
В основній функції ми створюємо три об’єкти лічильника класів. Вихідні дані відображають значення статичної змінної кожного разу, коли створюється об'єкт лічильника. Ми бачимо, що з кожним створеним об’єктом значення статичної змінної збільшується, а не повторно ініціалізується.
Статичний метод Java
Метод у Java є статичним, коли перед ним стоїть ключове слово “static”.
Деякі моменти, які потрібно пам’ятати щодо статичного методу, включають:
як бути програмістом для початківців
- Статичний метод належить класу на відміну від інших нестатичних методів, які викликаються за допомогою екземпляра класу.
- Щоб викликати статичний метод, вам не потрібен об’єкт класу.
- Статичні дані класу доступні статичному методу. Статичний метод може навіть змінювати значення статичного елемента даних.
- Статичний метод не може мати посилання на 'цей' або 'супер' члени. Навіть якщо статичний метод намагається звернутися до них, це буде помилкою компілятора.
- Так само, як статичні дані, статичний метод може також викликати інші статичні методи.
- Статичний метод не може посилатися на нестатичні члени даних або змінні, а також не може викликати нестатичні методи.
Наступна програма показує реалізацію статичного методу в Java:
class Main { // static method static void static_method() { System.out.println('Static method in Java...called without any object'); } public static void main(String() args) { static_method(); } }
Вихід:
Це проста ілюстрація. Ми визначаємо статичний метод, який просто друкує повідомлення. Тоді в основній функції викликається статичний метод без будь-якого об'єкта або екземпляра класу.
Ще один приклад реалізації статичного ключового слова в Java.
class Main { // static variable static int count_static = 5; // instance variable int b = 10; // static method static void printStatic() { count_static = 20; System.out.println('static method printStatic'); // b = 20; // compilation error 'error: non-static variable b cannot be referenced from a static context' //inst_print(); // compilation error 'non-static method inst_print() cannot be referenced from a static //context' //System.out.println(super.count_static); // compiler error 'non-static variable super cannot be //referenced from a static context' } // instance method void inst_print() { System.out.println('instance method inst_print'); } public static void main(String() args) { printStatic(); } }
У наведеній вище програмі, як бачите, у нас є два методи. Метод printStatic - це статичний метод, тоді як inst_print - метод екземпляра. У нас також є дві змінні, static_count - це статична змінна, а b - змінна екземпляра.
У статичному методі - printStatic спочатку ми відображаємо повідомлення, а потім намагаємося змінити значення змінної екземпляра b, а також викликаємо нестатичний метод.
Далі ми намагаємось використовувати ключове слово „super”.
b = 20;
inst_print ();
System.out.println (super.count_static);
Коли ми виконуємо програму з вищезазначених рядків, ми отримуємо помилки компіляції для використання змінних екземплярів, виклику нестатичних методів і посилання super у статичному контексті. Це обмеження статичного методу.
Коли ми коментуємо вищезазначені три рядки, лише тоді вищевказана програма працює нормально і видає наступний результат.
Вихід:
Перевантаження та відміна статичного методу
Як ви всі знаєте, як перевантаження, так і перевизначення є особливостями OOPS, і вони допомагають у поліморфізмі. Перевантаження можна класифікувати як поліморфізм під час компіляції, де ви можете мати методи з однаковим іменем, але різними списками параметрів.
Перевизначення є особливістю поліморфізму часу виконання, і в цьому методі базового класу замінено у похідному класі, так що підпис методу або прототип однакові, але визначення відрізняється.
Давайте обговоримо, як перевантаження та перевизначення впливають на статичний клас у Java.
Перевантаження
Ви можете перевантажити статичний метод у Java різними списками параметрів, але з однаковим ім'ям.
Наступна програма показує Перевантаження:
public class Main { public static void static_method() { System.out.println('static_method called '); } public static void static_method(String msg) { System.out.println('static_method(string) called with ' + msg); } public static void main(String args()) { static_method(); static_method('Hello, World!!'); } }
Вихід:
Ця програма має два статичні методи з однаковою назвою „static_method”, але інший список аргументів. Перший метод не приймає жодного аргументу, а другий метод приймає аргумент рядка.
Одним моментом, на який слід звернути увагу, є те, що ви не можете перевантажувати метод лише залежно від ключового слова 'static'. Наприклад, якщо у вас є метод екземпляра 'sum' і якщо ви визначите інший метод 'sum' і оголосите його статичним, то він не буде працювати. Ця спроба перевантаження на основі 'статичного' ключового слова призведе до помилки компіляції.
YouTube в MP4 конвертер безкоштовно в Інтернеті - -
Перевизначення
Оскільки статичні методи викликаються без будь-якого об'єкта класу, навіть якщо у вас є статичний метод з однаковим підписом у похідному класі, він не буде заміненим. Це тому, що без екземпляра не існує поліморфізму під час виконання.
Отже, ви не можете замінити статичний метод. Але якщо взагалі існує статичний метод з однаковим підписом у похідному класі, то метод виклику не залежить від об’єктів під час виконання, але залежить від компілятора.
Ви повинні зауважити, що хоча статичні методи неможливо замінити, мова Java не видає жодних помилок компілятора, коли у вас є метод у похідному класі з тим самим підписом, що і метод базового класу.
Наступна реалізація підтверджує цю думку.
classBase_Class { // Static method in base class which will be hidden in substatic_displayclass public static void static_display() { System.out.println('Base_Class::static_display'); } } classDerived_Class extends Base_Class { public static void static_display() { System.out.println('Derived_Class::static_display'); } } public class Main { public static void main(String args( )) { Base_Class obj1 = new Base_Class(); Base_Class obj2 = new Derived_Class(); Derived_Class obj3 = new Derived_Class(); obj1.static_display(); obj2.static_display(); obj3.static_display(); } }
Вихід:
У наведеній вище програмі ви можете бачити, що викликаний статичний метод не залежить від того, на який об’єкт вказує вказівник. Це тому, що об’єкти взагалі не використовуються зі статичними методами.
Статичний блок в Java
Подібно до того, як у вас на Java є функціональні блоки на мовах програмування, таких як C ++, C # тощо, існує спеціальний блок, який називається 'static', який зазвичай включає блок коду, пов'язаний зі статичними даними.
Цей статичний блок виконується в той момент, коли створюється перший об'єкт класу (саме під час завантаження класу) або коли використовується статичний член всередині блоку.
Наступна програма показує використання статичного блоку.
class Main { static int sum = 0; static int val1 = 5; static int val2; // static block static { sum = val1 + val2; System.out.println('In static block, val1: ' + val1 + ' val2: '+ val2 + ' sum:' + sum); val2 = val1 * 3; sum = val1 + val2; } public static void main(String() args) { System.out.println('In main function, val1: ' + val1 + ' val2: '+ val2 + ' sum:' + sum); } }
Вихід:
Зверніть увагу на порядок виконання операторів у вищезазначеній програмі. Вміст статичного блоку виконується спочатку, а потім основна програма. Статичні змінні sum і val1 мають початкові значення, тоді як val2 не ініціалізується (за замовчуванням 0). Тоді в статичному блоці val2 все ще не присвоюється значення, а отже, його значення відображається як 0.
Змінній val2 присвоюється значення після друку в статичному блоці і сума перераховується. Тому в основній функції ми отримуємо різні значення sum і val2.
Якщо ви вказали конструктор, то вміст статичного блоку виконується ще до конструктора. Статичні блоки в основному використовуються для ініціалізації статичних членів класу та інших ініціалізацій, пов'язаних із статичними членами.
Статичний клас Java
У Java у вас є статичні блоки, статичні методи і навіть статичні змінні. Звідси очевидно, що ви також можете мати статичні класи. У Java можна мати клас всередині іншого класу, і це називається вкладеним класом. Клас, що закриває вкладений клас, називається зовнішнім класом.
У Java, хоча ви можете оголосити вкладений клас як статичний, зовнішній клас не можна мати як статичний.
Давайте тепер дослідимо статичні вкладені класи в Java.
Статичний вкладений клас на Java
Як уже зазначалося, ви можете вкладений клас у Java оголосити статичним. Статичний вкладений клас відрізняється від нестатичного вкладеного класу (внутрішній клас) у деяких аспектах, перелічених нижче.
На відміну від нестатичного вкладеного класу, вкладений статичний клас не потребує зовнішнього посилання на клас.
Статичний вкладений клас може отримати доступ лише до статичних членів зовнішнього класу на відміну від нестатичних класів, які можуть отримати доступ до статичних, а також нестатичних членів зовнішнього класу.
Приклад статичного вкладеного класу наведено нижче.
class Main{ private static String str = 'SoftwareTestingHelp'; //Static nested class static class NestedClass{ //non-static method public void display() { System.out.println('Static string in OuterClass: ' + str); } } public static void main(String args()) { Main.NestedClassobj = new Main.NestedClass(); obj.display(); } }
Вихід:
У наведеній вище програмі ви бачите, що статичний вкладений клас може отримати доступ до статичної змінної (рядок) із зовнішнього класу.
Статичний імпорт у Java
Як відомо, ми зазвичай включаємо різні пакети та заздалегідь визначену функціональність у програму Java, використовуючи директиву “import”. Використання слова static із директивою імпорту дозволяє використовувати функціональність класу без використання класу.
Приклад:
import static java.lang.System.*; class Main { public static void main(String() args) { //here we import System class using static, hence we can directly use functionality out.println('demonstrating static import'); } }
Вихід:
У цій програмі ми використовуємо статичний імпорт для класу java.lang.System.
Примітка: У головній функції ми щойно використали out.println для відображення повідомлення.
Хоча функція статичного імпорту робить код більш стислим і читабельним, іноді це створює неоднозначність, особливо коли деякі пакунки мають однакові функції. Отже, статичний імпорт слід застосовувати лише в надзвичайних випадках.
Статичний проти нестатичного
Давайте обговоримо основні відмінності між статичними та нестатичними членами Java.
Нижче наведено відмінності між Статичні та нестатичні змінні .
Статичні змінні | Нестатичні змінні |
---|---|
Доступ до нього можна отримати, використовуючи лише назву класу. | Потрібен доступ до об’єктів класу. |
Доступні як статичним, так і нестатичним методам. | Доступні лише для нестатичних методів. |
Пам'ять для статичної змінної виділяється лише один раз для класу. | Пам'ять для нестатичних змінних виділяється на кожен об'єкт. |
Спільний доступ до всіх об'єктів класу. | Копіюється змінна на об'єкт. |
Має глобальний обсяг і доступний для всіх методів та блоків. | Має локальний обсяг і видимий для об’єктів класу. |
Нижче наведено різницю між статичними та нестатичними методами .
Статичні методи | Нестатичні методи |
---|---|
Метод, якому передує статичне ключове слово і доступний на рівні класу. | Метод, якому не передує статичне ключове слово і доступний для кожного з екземплярів класу. |
Підтримує час компіляції або раннє прив'язку. | Підтримує час виконання або динамічне прив'язку. |
Може отримати доступ лише до статичних даних членів свого класу та будь-якого іншого класу. | Має доступ до статичних, а також нестатичних членів класу та інших класів. |
Статичні методи не можна замінити. | Можна замінити. |
Пам'ять виділяється лише один раз. Отже, використовується менше пам'яті. | Споживання пам'яті більше, оскільки пам'ять виділяється кожного разу, коли викликається метод. |
Статичний проти фінального
Static та Final - це два ключові слова в Java, які можуть надати особливого значення сутності, з якою вона використовується. Наприклад, коли змінна оголошується статичною, вона стає змінною класу, до якої можна отримати доступ без посилання на об'єкт.
Подібним чином, коли змінна оголошується остаточною, вона стає незмінною, тобто константою.
Давайте розкладемо деякі основні відмінності між Static та Final ключовими словами в Java.
Статичні | Остаточний |
---|---|
Статичний член даних (вкладений клас, змінна або метод) - це елемент даних, якому передує статичне ключове слово, і до нього можна отримати доступ без об’єкта. | Кінцеве ключове слово можна застосувати до змінної, методу, класу тощо. і накладає обмеження на суб'єкти господарювання. |
Не обов’язково ініціалізувати статичну змінну зі значенням під час оголошення. | Потрібно, щоб кінцева змінна була ініціалізована значенням під час оголошення |
Ви можете повторно ініціалізувати статичні змінні. | Неможливо повторно ініціалізувати кінцеві змінні. |
Статичні методи - це ті, які можуть отримати доступ лише до статичних членів. | Остаточні методи - це методи, які неможливо успадкувати / перевизначити. |
Статичні класи - це класи, об’єкти яких неможливо створити. | Заключні класи - це класи, які неможливо успадкувати. |
Часті запитання
Q # 1) Чи може клас Java бути статичним?
Відповідь: Так, клас у Java може бути статичним, за умови, що це не зовнішній клас. Це означає, що статичними можуть бути лише вкладені класи в Java.
Q # 2) Коли слід використовувати Static у Java?
Відповідь: Всякий раз, коли вам потрібен член даних у вашій програмі, який повинен зберігати своє значення в усіх об'єктах, тоді вам слід використовувати static. Наприклад, лічильник. Метод може бути оголошений статичним, коли ви не хочете викликати його за допомогою об'єкта.
Q # 3) Чи може статичний клас мати конструктор?
Відповідь: Так, статичний клас може мати конструктор, і його метою є виключно ініціалізація статичних членів даних. Він буде викликаний лише вперше при доступі до членів даних. Він не буде викликаний для подальшого доступу.
Q # 4) Яка користь від Static Constructor?
Відповідь: Взагалі, конструктор використовується для ініціалізації статичних членів даних. Він також використовується для виконання операцій / дій, які потрібно виконати лише один раз.
Q # 5) Чи успадковуються статичні методи в Java?
найкраще безкоштовне програмне забезпечення для завантаження відео YouTube
Відповідь: Так, статичні методи в Java успадковуються, але не замінюються.
Висновок
У цьому підручнику ми детально обговорили статичне ключове слово Java, а також його використання в елементах даних, методах, блоках та класах. Ключове слово static - це ключове слово, яке використовується для позначення рівня класу або глобальної області дії.
Вам не потрібно отримувати доступ до статичних членів за допомогою екземплярів класу. Ви можете безпосередньо отримати доступ до статичних членів даних, використовуючи назву класу. Ми також обговорили основні відмінності між статичними та нестатичними членами, а також статичними та кінцевими ключовими словами.
У наступних темах ми розглянемо більше ключових слів та їх значення в мові Java.
Рекомендована література
- Статична в C ++
- Інтерфейс Java та підручник з абстрактних класів із прикладами
- Розгортання Java: Створення та виконання файлу JAR Java
- Віртуальна машина Java: як JVM допомагає у запуску програми Java
- Поняття C #: конструктор, деструктор, статичний клас, структура та перелік
- Модифікатори доступу в Java - Підручник із прикладами
- Підручник з роздумів про Java з прикладами
- Вступ до мови програмування Java - Підручник з відео