Mam następujący kod:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Wiem, Thing
że nic nie robi, ale mój program Hello, World dobrze się bez niego kompiluje. Tylko moje określone klasy zawodzą na mnie.
I odmawia kompilacji. Wchodzę No enclosing instance of type Hello is accessible."
na linię, która tworzy nową Rzecz. Zgaduję albo:
- Mam problemy na poziomie systemu (w DrJava lub mojej instalacji Java) lub
- Mam pewne podstawowe nieporozumienie, jak zbudować działający program w Javie.
Jakieś pomysły?
java
inner-classes
coolpapa
źródło
źródło
Odpowiedzi:
static class Thing
sprawi, że twój program będzie działał.W tej chwili masz
Thing
jako wewnętrzną klasę, która (z definicji) jest powiązana z konkretnym wystąpieniemHello
(nawet jeśli nigdy nie używa lub nie odnosi się do niego), co oznacza, że mówienie o błędzienew Thing();
bez określonegoHello
wystąpienia zakres.Jeśli zamiast tego zadeklarujesz ją jako klasę statyczną, to będzie to klasa „zagnieżdżona”, która nie potrzebuje konkretnej
Hello
instancji.źródło
outer class
,non-static inner class
zostanie ona utworzona, nawet jeśli nigdzie jej nie użyję?Zadeklarowałeś klasę
Thing
jako niestatyczną klasę wewnętrzną. Oznacza to, że musi być powiązany z instancjąHello
klasy.W swoim kodzie próbujesz utworzyć instancję
Thing
z kontekstu statycznego. Na to narzeka kompilator.Istnieje kilka możliwych rozwiązań. Wybór rozwiązania zależy od tego, co chcesz osiągnąć.
Wyjdź
Thing
zHello
klasy.Zmień
Thing
się nastatic
klasę zagnieżdżoną.Tworzenie instancji z
Hello
przed utworzeniem instancjiThing
.Ostatnie rozwiązanie ( niestatyczna klasa zagnieżdżona) byłoby obowiązkowe, gdyby jakakolwiek instancja
Thing
zależała od instancji,Hello
aby była znacząca. Na przykład, gdybyśmy mieli:każda surowa próba stworzenia obiektu klasy
Thing
, jak w:byłoby problematyczne, ponieważ nie byłoby oczywistej
enormous
wartości, aby przetestować 31 z nim. Wystąpienieh
wHello
zewnętrznej klasy jest to konieczne, aby zapewnić toh.enormous
wartości:Ponieważ to nie znaczy,
Thing
jeśli nie maHello
.Aby uzyskać więcej informacji na temat klas zagnieżdżonych / wewnętrznych: Zagnieżdżone klasy (samouczki Java)
źródło
Thing thing1 <<HelloInstantiation>>.new Thing()
kluczem jest składnia . Spędziłem kilka minut zdezorientowany przy użyciu składniThing thing1 new <<HelloInstantiation>>.Thing()
. = PCóż ... tyle dobrych odpowiedzi, ale chcę dodać więcej. Krótkie spojrzenie na klasę wewnętrzną w Javie - Java pozwala nam zdefiniować klasę w innej klasie, a możliwość zagnieżdżania klas w ten sposób ma pewne zalety:
Może ukrywać (zwiększa enkapsulację) klasę przed innymi klasami - szczególnie istotne, jeśli klasa jest używana tylko przez klasę, w której jest zawarta. W takim przypadku świat zewnętrzny nie musi o tym wiedzieć.
Może sprawić, że kod będzie łatwiejszy w utrzymaniu, ponieważ klasy są logicznie pogrupowane wokół miejsca, w którym są potrzebne.
Klasa wewnętrzna ma dostęp do zmiennych instancji i metod zawartych w niej klasy.
Mamy głównie trzy rodzaje
Inner Classes
Niektóre ważne punkty, o których należy pamiętać
Spróbujmy zobaczyć powyższe koncepcje praktycznie_
Mam nadzieję, że to pomoże wszystkim. Proszę odnieść się do więcej
źródło
Thing
jest klasą wewnętrzną z automatycznym połączeniem z instancjąHello
. Wystąpił błąd kompilacji, ponieważ nie ma instancji,Hello
do której mógłby się podłączyć. Możesz to naprawić najłatwiej, zmieniając go na statyczną klasę zagnieżdżoną, która nie ma połączenia:źródło
Zrozumiemy to za pomocą następującego prostego przykładu. Dzieje się tak, ponieważ jest to NIERSTATYCZNA KLASA WEWNĘTRZNA. Potrzebujesz instancji klasy zewnętrznej.
źródło