Обов’язковий екземпляр, що містить <моє посилання>


91

Обов’язковий екземпляр, який містить

Нижче наведено код. positionObjє об’єктом, який я намагаюся використовувати, і він видає мені вищевказану помилку.

Незрозуміло чому.

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}

Відповіді:


129

Ви намагаєтесь використовувати нестатичний внутрішній positionObjклас без екземпляра, Secretaryщоб він належав.
Нестатичний внутрішній клас повинен належати екземпляру його батьківського класу

Ймовірно, вам слід перейти positionObjна звичайний клас або статичний внутрішній клас.

Крім того, ви можете написати, someSecretary.new positionObj()щоб створити екземпляр внутрішнього класу, який належить someSecretaryекземпляру.


погодився, але це загальне твердження дещо незрозуміле. не могли б ви навести приклад чи вказати мені кудись, що може краще пояснити це? подяка
jason m

так. Спробувавши налагодити, я зрозумів, що якщо я зроблю свою позиціюObj статичною, це спрацює (у класі секретаря). Я щасливий, і все, що зараз це працює, але дякую за вказівник. Розглянемо фактичну причину цієї помилки.
jason m

2
Фактичною причиною помилки є те, що ви не вказали батьківський екземпляр. Не використовуйте нестатичні внутрішні класи, якщо вони вам дійсно не потрібні, і ви не розумієте, як вони працюють . c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
SL,

обидва рішення працюють бездоганно [1- роблячи клас positionObj статичним і 2- використовуючи OuterClass.new classObj ()]. спасибі
jason m

Так. Тим не менш, ви повинні розуміти свою базу коду досить добре, щоб зрозуміти, який з них правильний.
Слакс

16

Спочатку створіть об'єкт зовнішнього класу. У цьому випадку я думаю "секретар". Потім створіть positionObj. Подобається це,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();

СПАСИБІ! ... Я використовую Java з версії 1.0, і я не знав, що ти можеш це зробити!
Річард Т.

0

Правильним буде загальний підпис

public static HashMap<String, positionObj> main(String vArg)

вам не потрібно кваліфікувати positionObj, оскільки ви вже імпортуєте його.

Однак я впевнений, що основний метод повинен відповідати підпису нижче. Якщо ви хочете, щоб main був основним методом для вашої програми, змініть підпис на

 public static void main(String[] args) {...}

Ви можете створити окремий статичний метод, який повертає Map і викликає його з main.

Як примітка, усі класи повинні починатися з великої літери positionObj, має бути PositionObj.


привіт, залишив трохи коду. домовились про справу. клас щось повертає, але помилка тут, і мені незрозуміло чому.
jason m

@jason, я не думаю, що ти можеш повернути що-небудь з main.
hvgotcodes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.