Dziedziczenie zmiennych globalnych

0

Mam problem ze zrozumieniem zasad dziedziczenia. Przedstawiam na poniższym przykładzie:

public class KlasaGlowna
{
    Klasa1 klasa1;
    int cyfra;

    public static void main(String[] args) 
    { 
       KlasaGlowna klasaGlowna = new KlasaGlowna();
       klasaGlowna.dzialaj();
    }

    public void dzialaj()
    {
       cyfra = 5;
       klasa1 = new Klasa1(this);
       klasa1.start();
    }
}
public class Klasa1 extends KlasaGlowna
{
    KlasaGlowna klasaGlowna;

    public Klasa1(KlasaGlowna klasaGlowna)
    {
        this.klasaGlowna = klasaGlowna;
    }

    public void start()
    {
        System.out.println(cyfra);
    }   
}

Dlaczego Klasa1 nie widzi wartości zmiennej "cyfra"?

0

Musisz dodać przez deklaracją zmiennej modyfikator dostępu protected. W tym momencie nie podałeś modyfikatora dostępu, więc został przyjęty domyślny czyli private. Zmienna private jest widoczna tylko wewnątrz klasy, w której została zadeklarowana.

Edit: Podstawy Javy
Wygląda na to, że jednak domyślny modyfikator dostępu w Javie ma zakres pakietu, a nie private.

0

Kod oczywiście działa, gdy modyfikator dostępu ustawię jako "static", ale chyba nie powinienem go tak ustawiać. Wydaje mi się, że to nie modyfikator jest problemem.

0

Tworzysz dwa różne obiekty => są więc dwie różne zmienne cyfra. Inną zmienną zmieniasz w metodzie działaj, inną wyświetlasz w metodzie start.

    public void dzialaj()
    {
       cyfra = 5;
       klasa1 = new Klasa1(this);
       klasa1.cyfra = 5;
       klasa1.start();
    }
0

Myślałem, że skoro zadeklarowałem zmienną na początku, to przypisując jej wartość w metodzie "działaj", zmieniłem wartość zmiennej globalnej. Jeśli nie, to w jaki sposób mam przypisywać zmiennej wartość, tak aby była dostępna np. w innych metodach KlasaGlowna? I żeby z Klasa1 wywoływać ją bezpośrednio, bez korzystania z instancji klasy? Czy jednak powinienem użyć modyfikatora "static"?

0

Jeżeli ma być dostępna z każdej instancji, a nawet bez instancji to "static"

0

W Javie nie ma zmiennych globalnych. Można je emulować zmiennymi static, jednak staraj się ich unikać.

0

To jaki sens ma deklarowanie zmiennej na początku? Równie dobrze mógłbym ją zainicjować i przypisać jej wartość, dopiero w metodzie "działaj"?

0

Tak właśnie zrobiłeś, nadałeś wartość zmiennej cyfra dopiero w metodzie dzialaj. Jeśli chodzi Ci o deklarację zmiennej, to gdybyś ją zadeklarował w metodzie dzialaj, to byłaby ona zmienną lokalną tej metody, niewidoczną poza tą metodą.

0

Dzięki za odpowiedzi, już rozumiem. Jeszcze pytanie odnośnie modyfikatora static. Dlaczego lepiej unikać stosowania zmiennych static?

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