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.
- public class Main {
- private int tal;
-
- public static void main(String args[]) {
- Main.tal = 10; //Kan du ikke for tal er ikke statisk men instans.
- (new Main()).tal = 10; //Kan du godt for nu har du en instans.
- }
- }
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:
- public class Main {
-
- public static void main(String args[]) {
- Main myMain = new Main();
- Thread t1 = new Thread(myMain.new bla());
- t1.start();
- }
-
- private class bla implements Runnable {
- public void run() {
- try {
- System.out.println("Hello");
- Thread.sleep(1000);
- System.out.println("Hello");
- } catch (Exception e) {
- }
- }
- }
- }
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:
- public class Main {
-
- public static void main(String args[]) {
- Main myMain = new Main();
- Thread t1 = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- System.out.println("Hello");
- Thread.sleep(1000);
- System.out.println("Hello");
- } catch (Exception e) {
- }
-
- }
- });
- t1.start();
- }
- }
Indlæg senest redigeret d. 18.07.2012 14:51 af Bruger #14645