Przesłanianie - co to jest?

0

Cześć, czy to jest przesłanianie?

public class matematyka {

	static int a = 1;

	public static void main(String[] args) {
		System.out.println(a);
		int a = 2;
		System.out.println(a);

	}
}

dodanie znacznika <code class="java"> - furious programming

1

nie. (w sensie Klas itp.) Tak, ale to przesłonięcie lokalne, które raczej jest rzadziej spotykane bo prowadzi do problemów.

Przykład:

Dal przesłaniania pola jak i dla przesłaniania metody potrzebne jest dziedziczenie. Klasa dziedzicząca może przesłaniać metody/pola. W twoim kodzie jest zmiana wartości pola ;)

tu info z jakiegos gimnazjum (najszybciej po polsku co mogłem znaleźć ;) ): http://www.gm11.resman.pl/portal/index.php?option=com_content&view=article&id=432%3Aprzesanianie-metod-i-skadowe-statyczne&catid=61%3Aprogramowanie-w-java&Itemid=86&limitstart=5 i http://www.gm11.resman.pl/portal/index.php?option=com_content&view=article&id=432%3Aprzesanianie-metod-i-skadowe-statyczne&catid=61%3Aprogramowanie-w-java&Itemid=86&limitstart=3

EDIT:
Dodano odp "TAK" po sugestii Aux, bo to przesłonięcie lokalne jest. Ale IMO od przesłonięcia lokalnego trzeba trzymać się z daleka. Case in point: http://www.leepoint.net/notes-java/data/variables/60shadow-variables.html

0

http://docs.oracle.com/javase/tutorial/java/IandI/override.html "szukajcie a znajdziecie" programowanie według św. Jana

1
Awgwa napisał(a):

public class matematyka {

static int a = 1;

public static void main(String[] args) {
	System.out.println(a);
	int a = 2;
	System.out.println(a);

}

}


Dlaczego to nie jest przesłonięciem? Przecież nazwa a, która wcześniej oznaczała pole klasy, została przesłonięta przez zmienną lokalną.
1

Jeśli w hierarchii klas metoda klasy dziedziczącej ma taką samą nazwę i sygnaturę typu jak metoda klasy dziedziczonej, to zwykło się mówić, iż metoda klasy dziedziczącej przesłania odpowiednią metodę klasy dziedziczonej. Wywołanie takiej metody dla instancji klasy dziedziczącej zawsze spowoduje wykonanie wersji zdefiniowanej w klasie dziedziczącej. Wersja zdefiniowana w klasie dziedziczonej zostanie ukryta. Gdy jednak zechcemy wywołać ukrytą wersję metody z klasy dziedziczonej w granicach klasy dziedziczącej, należy zastosować słowo kluczowe "super". Poniższy przykład prezentuje proste przesłanianie i wykorzystywanie słowa kluczowego "super".

public class ClassA {
	
	private int width;
	private int height;
	
	ClassA(int w, int h) {
		this.width = w;
		this.height = h;
	}
	
	public int[] getProperties() {
		return new int[] {width, height};
	}
}

public class ClassB extends ClassA {
	
	private int depth;
	
	ClassB(int w, int h, int d) {
		super(w, h);
		
		this.depth = d;
	}
	
	public int[] getProperties() {
		int[] p = super.getProperties();
		return new int[] {p[0], p[1], depth};
	}
}

public class ClassC {
	
	public static void main(String args[]) {
		
		ClassA a = new ClassA(10, 20);
		int[] propertiesA = a.getProperties();
		for (int i : propertiesA) {
			System.out.println("ClassA : " + i);
		}
		
		ClassB b = new ClassB(propertiesA[0], propertiesA[1], 30);
		int[] propertiesB = b.getProperties();
		for (int i : propertiesB) {
			System.out.println("ClassB : " + i);
		}
	}
}
0

OK, a moglibyście jeszcze napisać czym się różni przesłanianie od przedefiniowania (tak na chłopski rozum)?

1

Prawdę mówiąc nie spotkałem się wcześniej z terminem przedefiniowania. Z tego co teraz czytam to wprowadzono Cię w mały błąd.
Przesłanianie dotyczy sytuacji gdy w zasięgu zmiennej, metody lub typu pojawi się inna jej definicja, np. zmienną globalną przesłania się inną, o zasięgu lokalnym(o ile się nie mylę jest to dozwolone).
Przedefiniowanie dotyczy podobnej sytuacji, ale w przypadku dziedziczenia, jak jak wcześniej to wytłumaczono. Jeżeli nie uczysz się do jakiegoś testu to to rozróżnienie Ci się raczej nie przyda.

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