klasa abstrakcyjna a zmienne globalne

0

Mam problem ze zmiennymi globalnymi (static) w klasie abstrakcyjnej, ponieważ odwołując się do zmiennych statycznych klasy abstrakcyjnej poprzez obiekty dziedziczące po tej klasie, nie mogę zmieniać ich wartości,
Gdzie robie błąd ? i jak się poprawnie odwołać do zmiennej statycznej aby można było ją modyfikować jak i odczytywać ?


//ponizej klasa abstarkcyjna 

public abstract class Element {

    static int Swysokosc, Sszerokosc = 0;
    static int SpozX, SpozY = 0;
    static int SpozXpoczatkowa, SpozYpoczatkowa, SpozXkoncowa, SpozYkoncowa = 0;
    static int Scenterx = 0;

    int wysokosc, szerokosc = 0;
    int pozX, pozY = 0;

         public abstract void narysujSie(Graphics g);

} 

//jedna z klas dziedziaczących po klasie Element

         public class BlokStart extends Element{

        String wyrazenie = "Start";

        public void BlokStart(){//Points Dane){

               this.pozX = 200;
               this.pozY = 0;
               Element.SpozY = this.pozY + wysokoscstartu); // nie zmienia wartosci zmiennej statycznej SpozY             
             }

     public void narysujSie(Graphics g){

     //   g.draw ......}
     
}


0

Dziwne. Wygląda to na kolejny błąd JVM jeśli chodzi o obsługę statycznego dziadostwa :P

Najlepszym rozwiązaniem jest całkowite oduczenie się używania słowa kluczowego static i używania go tylko przy definiowaniu metody rozruchowej main. Jeśli potrzebujesz przepychać jakieś tam dane poprzez skomplikowaną hierarchię obiektów to posłuż się wstrzykiwaczem zależności, np Google Guice.

0

Jaki bug? wszystko działa... autor tematu pewnie w ogóle tej metody nie wywołuje... i co to za pomysł nazywać metodę w UpperCamelCase... pewnie coś pomyliłeś... dodaj tam println('wtf') zeby się upewnic, ze to w ogóle jest wywoływane....

0

Masz rację, to

        public void BlokStart(){//Points Dane){
 
               this.pozX = 200;
               this.pozY = 0;
               Element.SpozY = this.pozY + wysokoscstartu); // nie zmienia wartosci zmiennej statycznej SpozY             
             }

jest zapewne (w intencji autora) konstruktor.

0
abstract class Element {
    static int Swysokosc = 0, Sszerokosc = 0;
    static int SpozX, SpozY = 0;
    static int SpozXpoczatkowa, SpozYpoczatkowa, SpozXkoncowa, SpozYkoncowa = 0;
    static int Scenterx = 0;
    int wysokosc, szerokosc = 0;
    int pozX = 0, pozY = 0;
    public abstract void narysujSie();
}

public class test extends Element {
    String wyrazenie = "Start";
    public void BlokStart() {//zwykła metoda, nie konstruktor
        this.pozX = 200;
        this.pozY = 0;
        Element.Swysokosc = 242;
        System.out.println(this.Swysokosc);
    }
    public static void main(String argv[]) {
        test t = new test();
        t.BlokStart();
    }
    public void narysujSie() {
    }
}
razi@PieCyk:~$ javac test.java && java test
242

Działa, zmienił wartość pola statycznego, nieważne czy odwołuję się poprzez this, Element, czy test, wszystkie kombinacje u mnie chodzą.

U siebie w programie używam klasy z ustawieniami, której wszystkie pola (w 95% booleany) są statyczne i wszystko działa. Czasem lepiej użyć tego static niż męczyć się z przekazywaniem obiektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1