Виправлення: нестатичний метод не може бути посилається на статичний контекст

Багато програмістів стикаються з повідомленням про помилку " Нестатичний метод не може бути посилається зі статичного контексту ", коли вони кодують. Це повідомлення про помилку не є конкретним і може виникати в будь-якій IDE, якщо умови для помилки справжні.

Нестатичний метод не може посилатися на статичний контекст

Це дуже поширена помилка для початківців, коли програміст намагається використовувати клас «статично», не роблячи примірника класу. Під час використання класу, який є статичним, необхідно виконати кілька умов. У цій статті ми розглянемо декілька різних випадків та допоможемо вам використовувати статичний клас.

Що таке статичний метод?

Додавання ключового слова "статичний" до будь-якого методу робить метод відомим як статичний метод. Статичний метод належить до класу, а не належить до об'єкта (що є нормою). Статичний метод можна легко викликати без умови створення екземпляра класу.

Існує кілька різних застосувань статичних методів, наприклад, використовуючи його, ви можете змінити статичний член даних та його значення. Однак існують деякі обмеження при використанні статичного методу. Наприклад, якщо ви хочете отримати доступ до нестатичних полів свого класу, ви повинні використовувати нестатичний метод. Отже, підсумовуючи, Статичні методи використовуються дуже просто, але вони мають свої переваги.

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

 студенти класу {int roll_no; Назва рядка; static String college = "InformationTech"; статична зміна недійсності () {college = “Management”;} Студенти (int номер, рядок name_self) {roll_no = число; ім'я = ім’я_};} void display () {System.out.println (rollno + "" + ім'я + "" + коледж);} публічна статична недійсна головна (String args []) {Students.change (); Студенти stu_1 = нові Студенти (100, "Мексиканська"); Студенти stu_2 = нові Студенти (202, "Американські"); Студенти stu_3 = нові студенти (309, "британці"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

Вихід програми буде:

 100 мексиканського менеджменту 202 американського менеджменту 309 британського менеджменту 

Яка різниця між класом та екземпляром класу?

Подумайте, що ви йдете вулицею і бачите машину. Тепер ви відразу знаєте, що це автомобіль, навіть якщо ви не знаєте, яка його модель чи тип. Це тому, що ви знаєте, що це відноситься до класу «автомобілів», про який ви вже знаєте. Розгляньте тут клас як шаблон або ідею.

Тепер, коли ви підходите ближче, ви бачите модель і марку автомобіля. Тут ви розпізнаєте "екземпляр" класу "автомобіль". Тут усі властивості будуть детально представлені; колеса, кінські сили, диски тощо.

Прикладом властивостей може бути те, що клас "автомобіль" зазначає, що всі машини повинні мати колеса. Автомобіль, який ви бачите (екземпляр автомобільного класу), має сплави на диски.

У об'єктно-орієнтованому програмуванні ви визначаєте клас самостійно, а всередині класу ви визначаєте поле типу 'color'. Кожного разу, коли клас створюється миттєво, пам'ять автоматично резервується для кольору в западному періоді та пізніше, ви можете надати цьому певне значення (наприклад, червоне). Оскільки такі атрибути є специфічними, вони нестатичні.

На відміну від них статичні методи та поля поділяються з усіма екземплярами. Вони створені для значень або елементів, специфічних для класу, а не самого екземпляра. Для методів можуть бути глобальні методи (наприклад, конвертер stringtoInt), а для полів вони, як правило, постійні відповідно до вашого коду (наприклад, тип автомобіля може бути статичним, якщо ви виготовляєте лише звичайні машини).

Тепер ми розглянемо всі різні випадки, коли ваше кодування може піти не так, і побачимо способи їх усунення.

Випуск 1: Ви викликаєте щось, чого не існує

Ми стикалися з деякими випадками, коли користувачі використовували як статичні, так і нестатичні методи. Коли ми це робимо, ви повинні бути обережними, який метод викликає, що (з точки зору статичного чи ні). Погляньте на наступний код:

 приватний java.util.List someMethod () {/ * деякий код * / повернути деякий список; } public static void main (String [] strArgs) {// Наступне твердження викликає помилку. Ви знаєте, чому .. java.util.List someList = someMethod (); } 

Тут статичний метод викликає деякийМетод. В об'єктно-орієнтованому програмуванні ми інкапсулюємо дані разом із тими, якими ми хочемо оперувати. Тут без об’єкта немає даних про екземпляри, і хоча методи екземпляра існують як частина визначення класу, завжди повинен бути об'єктний екземпляр для надання їм даних.

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

Випуск 2: Методи не робляться статичними

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

 публічний клас BookStoreApp2 {// константи для опцій вводу сканера = новий сканер (System.in); public static void main (String [] args) {BookStoreItem [] item; // декларування елемента масиву = new BookStoreItem [10]; // ініціалізація масиву int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // кінець оператора переключення} // кінець для циклу for (int i = 0; i <item.length; i ++) {} // кінець of for} // кінець основного методу 

Тут у цьому коді вам потрібно перетворити і методи printMenu (), і getUserChoice () в статичні.

Отже, якщо ви хочете обійти подібну ситуацію, замість цього можете використовувати конструктор . Наприклад, ви можете взяти вміст свого основного () методу і помістити їх всередину конструктора.

 public BookStoreApp2 () {// Помістіть сюди вміст основного методу} Після цього виконайте наступне всередині свого основного () методу: public void main (String [] args) {new BookStoreApp2 (); } 

Якщо ці поради не впливають на ваш код або ваш код відрізняється, вам слід пам’ятати про основні принципи статичних класів і методів і повторно перевірити свій код, щоб переконатися, що основний принцип не порушується.

Цікаві Статті