Avatar billede themepark Nybegynder
22. marts 2005 - 16:59 Der er 10 kommentarer og
1 løsning

Scope på variabler i sub-classes

Jeg har følgende kode, hvor jeg benytter variablen i, i begge classes, og derfor gerne vil gøre den global

public class Test2 {
  public static void main(String[] args) {
    Test j = new Test();
    i=2;
  }
}


class Test {
  byte i;
  public Test() {
    i=1;
  }
}

Som det er nu, får jeg at vide at i cannot be resolved, og det får jeg at vide i Test2. Flytter jeg byte i; derop, får jeg samme fejl men for class Test. Flytter jeg i stedet class Test ind i Test2, altså således:

public class Test2 {
  byte i;
  public static void main(String[] args) {
    Test j = new Test();
    i=2;
  }
  class Test {
    public Test() {
      i=1;
    }
  }
}

får jeg en (for mig) meget mystisk fejlmeddelelse.

No enclosing instance of type Test2 is accessible. Must qualify the allocation with an enclosing instance of type Test2 (e.g. x.new A() where x is an instance of Test2)

Og den fejl får jeg ved Test j linjen. HJÆLP! :(
Avatar billede arne_v Ekspert
22. marts 2005 - 17:01 #1
public class Test2 {
  public static void main(String[] args) {
    Test j = new Test();
    j.i=2;
  }
}


class Test {
  public byte i;
  public Test() {
    i=1;
  }
}

bør compile
Avatar billede arne_v Ekspert
22. marts 2005 - 17:02 #2
hold dig fra klasser indeni klasser
Avatar billede themepark Nybegynder
22. marts 2005 - 17:07 #3
Hvis jeg skal holde mig fra det, så smadrer du jo fuldstændigt det, jeg skrev, jeg havde lavet i mit forrige spørgsmål *g*

Det er ikke så meget fordi jeg vil referere til den samme variabel, det er mere fordi jeg gerne vil bruge det samme navn for 2 forskellige variabler (f.eks. til to for løkker), og i stedet for så at skulle deklarere dem i hver deres klasse synes jeg jo, det ville være smartere at deklarere variablen globalt :)
Avatar billede arne_v Ekspert
22. marts 2005 - 17:11 #4
Her er et eksempel som skulle vise hvordan inner classes virker:

public class Outer {
  private int outerv;
  public Outer() {
      outerv = 123;
  }
  public void print() {
      System.out.println(outerv);
  }
  public class Inner {
      private int innerv;
      public Inner() {
        innerv = outerv + 1;
      }
      public void print() {
        System.out.println(innerv);
      }

  }
  public static void main(String[] args) {
      Outer out = new Outer();
      out.print();
      Outer.Inner in = out.new Inner();
      in.print();
  }
}
Avatar billede themepark Nybegynder
22. marts 2005 - 17:14 #5
Jeg er skam fint med på hvordan de virker, blot ikke på hvordan jeg definerer globale variabler, som kan benyttes i alle classes, men som ikke skal refereres på den måde med j.i :)
Avatar billede arne_v Ekspert
22. marts 2005 - 17:20 #6
Hvis du ved hvordan de virker - hvorfor skriver du så ikke noget kode som virker ?
Avatar billede arne_v Ekspert
22. marts 2005 - 17:21 #7
public class Test2 {
  byte i;
  public static void main(String[] args) {
    new Test2();
  }
  Test2() {
    Test j = new Test();
    i=2;
  }
  class Test {
    public Test() {
      i=1;
    }
  }
}

compiler f.eks.
Avatar billede themepark Nybegynder
22. marts 2005 - 17:25 #8
Nå nå, man er gnaven i dag ;) Det kunne f.eks. være fordi at det eneste der ikke virker, er netop det jeg ikke kan finde ud af og som jeg lige har stillet et spørgsmål omkring? ;)
Avatar billede arne_v Ekspert
22. marts 2005 - 17:29 #9
Hvis du ikke vil have noget. foran så skal de ligge i samme klasse

(medmindre du i Java 1.5 bruger static import, hvilket umiddelbart ikke virker
relevant her)
Avatar billede themepark Nybegynder
22. marts 2005 - 17:36 #10
Ah...jeg har lige opdaget, hvor jeg gik galt i byen henne :) Jeg havde min kode i main, i stedet for i Test2 constructoren, så nu hvor det er flyttet, er fejlene væk :) Smid et svar.
Avatar billede arne_v Ekspert
22. marts 2005 - 17:37 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester