Ви оголосили клас Thingнестатичним внутрішнім класом. Це означає, що він повинен бути пов'язаний з екземпляром Helloкласу.
У своєму коді ви намагаєтеся створити екземпляр Thingзі статичного контексту. Саме на це скаржиться компілятор.
Є кілька можливих рішень. Яке рішення використовувати, залежить від того, чого ви хочете досягти.
Виходьте Thingз Helloкласу.
Зміна, Thingщоб бути staticвкладеним класом.
static class Thing
Створення екземпляра з Helloдо створення екземпляра Thing.
public static void main(String[] args)
{
Hello h = new Hello();
Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P
}
Останнє рішення ( нестатичний вкладений клас) було б обов'язковим, якби будь-який екземпляр Thingзалежав від екземпляра, Helloякий має значення. Наприклад, якщо ми мали:
public class Hello {
public int enormous;
public Hello(int n) {
enormous = n;
}
public class Thing {
public int size;
public Thing(int m) {
if (m > enormous)
size = enormous;
else
size = m;
}
}
...
}
будь-яка необроблена спроба створити об’єкт класу Thing, як у:
Thing t = new Thing(31);
було б проблематично, оскільки не було б очевидного enormousзначення для тестування 31 проти нього. Примірник hз Helloзовнішнього класу необхідно , щоб забезпечити цю h.enormousвеличину:
...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...
Тому що це не означає, Thingякщо він не має Hello.
Для отримання додаткової інформації про вкладені / внутрішні класи:
Вкладені класи (навчальні програми Java)