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: https://4programmers.net/Java/Podstawy_Javy#modyfikator-domyslny
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?

0

Zmienne statyczne łamią założenia programowania obiektowego, gdzie każdy obiekt ma swój własny stan reprezentowany przez instancję oraz cykl życia którym można zarządzać tworząc i niszcząc obiekty. Zmienne statyczne reprezentują stan pomiędzy instancjami, co może być szczególnie kłopotliwe przy pisaniu testów jednostkowych. Poza tym pozostaje kwestia wiele wątków w sytuacji gdy będą chciały używać takiej zmiennej statycznej, to będzie trzeba zarządzać dostępem.

0

Jeśli już musisz używać pól statycznych, to zrób sobie tę przyjemność i nie zapomnij dodać słówa kluczowego final, również.

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