Fejl, når jeg laver et objekt af private inner class

Tags:    java

Hvorfor virker den her kode ikke?

Fold kodeboks ind/udJava kode 




8 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Når du laver indre ikke-statiske klasser er de på mange måder som et almindelig instans field.

Forestil dig at din Main klasse have en heltalsfelt ( private int tal; ). For at tilgå den skal du have en instans af din main klasse. Husk "tal" er ikke-statisk så du kan ikke bare sige Main.tal, du er nødt til at lave en Main klasse.

Fold kodeboks ind/udJava kode 


Fejlen din kode giver i min eclipse compiler er:
No enclosing instance of type Main is accessible. Must qualify the allocation with an enclosing instance of type Main (e.g. x.new A() where x is an instance of Main).

Hvis man nærlæser det lidt siger den følgende:
Ingen instans af type Main er tilgængelig. Du skal kvalificere allokeringen med en omkringliggende instans af typen Main. (f.eks. x.new A() hvor x er en instans af Main.


Så for at løse problemet skal du bruge en instans af Main:
Fold kodeboks ind/udJava kode 


Hvorfor er det nødvendigt? Indre klasser kan tilgå den ydre klasses instansvariabler. For at tilgå instansvariabler er du derfor nød til at have en instans af klassen.

I Java kan man også lave det der hedder en anonym indre klasse. Hvis du bare skal bruge en enkelt indre klasse eller har svært ved at navngive den kan det være det er sådan en du leder efter:
Fold kodeboks ind/udJava kode 





Indlæg senest redigeret d. 18.07.2012 14:51 af Bruger #14645
Både "bla" og (new Runnable {...}) er klasser. Hvis du kigger i din bin mappe vil du se de bliver til vidst nok Main.bla.class og Main$1.class eller sådan noget. Hvilket er den Javas bytekode version af klasser.

Så når din Main method kører når når til linjen: (new Runnable() {...}) så laver den en ny instans af Main$1.class for eksempel.

Så selvom det ikke ligner det, fordi f.eks. class nøgleordet mangler, så definerer du stadig en klasse. En der implementer Runnable.



Indlæg senest redigeret d. 18.07.2012 15:15 af Bruger #14645
Det gør den heller ikke?

Fold kodeboks ind/udJava kode 


Svarer nogenlunde til:

Fold kodeboks ind/udJava kode 


Mener du hvorfor skal jeg ikke bruge en instans af Main når jeg laver (new Runnable {...})???

Det er fordi at lige i mit eksempel ovenover så er anonyme indre klasser statiske. Siden de er statiske kan de laves uden en instans af Main - men de kan samtidig heller ikke tilgå instansvariabler i nogen instans af main.

Når du gør noget statisk siger du til compileren - Jeg vil gerne tilgå uden at skulle bruge en instans - hvor compileren svarer fair nok - men så kan du altså heller ikke få lov at tilgå instansvariabler. Det er selvfølgelig ikke hele historien om static.



Indlæg senest redigeret d. 18.07.2012 15:26 af Bruger #14645
Jeg er godt nok ej JAVA haj, men du kan da ikke lave en class inde i en anden class? Og hvorfor kalde din class Main?



Jeg er godt nok ej JAVA haj, men du kan da ikke lave en class inde i en anden class? Og hvorfor kalde din class Main?


Fordi min klasse indeholder Main metoden (det er da også ligemeget hvad man kalder sin klasse :P), og jo, man kan godt lave en private inner class...



Når du laver indre ikke-statiske klasser er de på mange måder som et almindelig instans field.

Forestil dig at din Main klasse have en heltalsfelt ( private int tal; ). For at tilgå den skal du have en instans af din main klasse. Husk "tal" er ikke-statisk så du kan ikke bare sige Main.tal, du er nødt til at lave en Main klasse.

Fold kodeboks ind/udJava kode 


Fejlen din kode giver i min eclipse compiler er:
No enclosing instance of type Main is accessible. Must qualify the allocation with an enclosing instance of type Main (e.g. x.new A() where x is an instance of Main).

Hvis man nærlæser det lidt siger den følgende:
Ingen instans af type Main er tilgængelig. Du skal kvalificere allokeringen med en omkringliggende instans af typen Main. (f.eks. x.new A() hvor x er en instans af Main.


Så for at løse problemet skal du bruge en instans af Main:
Fold kodeboks ind/udJava kode 


Hvorfor er det nødvendigt? Indre klasser kan tilgå den ydre klasses instansvariabler. For at tilgå instansvariabler er du derfor nød til at have en instans af klassen.

I Java kan man også lave det der hedder en anonym indre klasse. Hvis du bare skal bruge en enkelt indre klasse eller har svært ved at navngive den kan det være det er sådan en du leder efter:
Fold kodeboks ind/udJava kode 



Mange tak ! - Jeg har dog et spørgsmål til:
- Når du laver et objekt af Runnable i den anonyme indre klasse, hvordan kan det så være at den bliver håndteret som en klasse, så man kan override run metoden? Man laver jo et objekt ikke en klasse?



Men, hvorfor laver den en instans af Main, når der står new Runnable()?? o.o



Okay, mange tak for svarene :D




t