Kurs Java Podstawy - rozszerzony

JavaTraps 005

W dzisiejszej pułapce poruszymy zagadnienie lokowania zmiennych w pamięci, ich porównywania i tego co tak naprawdę zmieniamy przekazując argumenty metodom. Dodatkowym zagadnieniem są referencje finalne.

Warto się nad tym zastanowić, ponieważ zarówno początkujący jak i nieco bardziej doświadczeni programiści często mogą wpaść w problemy. Błędy spowodowane z zagadnieniem, które poruszamy może być powodem błędów bardzo trudnych do wykrycia w przypadku skomplikowanej hierarchii klas i tysiącach linii kodu odnalezienie źródła komplikacji zajmie nam wiele godzin.

Poniższy kod przedstawia dwie klasy. Pierwsza z nich posłuży nam do utworzenia obiektu przechowującego jedną wartość typu int. W drugiej przetestujemy różne działania z nią związane.

public class Zmienna {
	public Zmienna(int x) {
		this.x = x;
	}

	public int x;
}

public class Test {

	static void metoda1(Zmienna z) {
		z.x = -1;
		z = null;
	}

	static void metoda2(final Zmienna z) {
		z.x = -2;
	}

	public static void main(String[] args) {
		Zmienna a = new Zmienna(1);
		final Zmienna b = new Zmienna(2);

		//instrukcja 1
		metoda1(a);
		System.out.print(a.x + " ");
		//instrukcja 2
		metoda1(b);
		System.out.print(b.x + " ");

		Zmienna c = new Zmienna(1);
		final Zmienna d = new Zmienna(2);

		//instrukcja 3
		metoda2(c);
		System.out.print(c.x + " ");
		//instrukcja 4
		metoda2(d);
		System.out.print(d.x + " ");
	}
}

Pytanie jak zwykle: co się stanie po wykonaniu instrukcji 1,2,3,4?

a) NullPointerException ...

b) 1 2 1 2

c) -1 -1 -1 -1

d) -1 -1 -2 -2

e) Inna odpowiedź

Zobacz odpowiedź.

 + " "

Komentarze