Moim zdaniem starczy już tych wykładów o samym tworzeniu gier. Język C też już wyczerpałem aż nadto, zatem wrócę do Javy i opiszę bardziej podstawowe rzeczy. Na przykład czym jest konstruktor w języku Java. Co to jest. Co on robi. Jak go zdefiniować. Na tym się dzisiaj skupimy.

KONSTRUKTOR W JĘZYKU JAVA. DEFINICJA

Gdyby ktoś się upierał przy pytaniu "CO to jest konstruktor?", odpowiedzcie, że jest to metoda tworząca kopię danej klasy czyli obiekt. Ważne jest również rozróżnianie jednego od drugiego. Klasa to szablon obiektu, obiekt to kopia klasy. Nie będę pisał co dokładnie dzieje się "pod maską" kompilatora, wspomnę jedynie, że dochodzi do zaalokowania odpowiedniego miejsca w pamięci, a sam obiekt w Javie później "znika" bez konieczności ręcznego zwalniania pamięci w wyniku działania "odśmiecacza pamięci".

Zaglądając do kodu źródłowego, konstruktor w Java rozpoznaje się poprzez dwa zapisy. Pierwszy z nich osadzony jest w danej klasie i wygląda tak:

public class Example
{
	// konstruktor w Java
	public Example()
	{
		// instrukcje
	}
}

a drugi zapis odgrywa rolę wywołania konstruktora w celu utworzenia obiektu bazującego na tej klasie i wygląda on tak:

Example e = new Example();

Konstruktor w języku Java stanowi podstawę w rozumieniu paradygmatu obiektowego. Jak każda inna metoda, on sam również może posiadać parametry formalne, które przydają się do inicjowania danych składowych. Ponadto, można przeciążąć konstruktory czyli utworzyć kilka w jednej klasie różniących się parametrami. Warto jeszcze wspomnieć, że można uniknąć tworzenia własnych konstruktorów. Wówczas kompilator dodaje go automatycznie, a nowo wygenerowany konstruktor jest bezparametrowy (określany jest jako "domyślny").

PRZYKŁAD KODU ŹRÓDŁOWEGO

Tęsknicie za okienkami z kodem? Mam dla Was kolejne. Oto przykład programu wykorzystującego konstruktor w języku Java. Posiada on dwie klasy: uruchomieniową "Main" oraz "Example" służącą za przykład:

KLASA "MAIN"

public class Main
{
	public static void main(String[] args)
	{
		Example a = new Example();
		Example b = new Example(15);
	}
}

KLASA "EXAMPLE"

public class Example
{
	public Example()
	{
		System.out.println("Wypisuję tekst poprzez wyraźne polecenie konstruktora.");
	}

	public Example(int n)
	{
		System.out.println("Kazano mi, abym wyświetlił liczbę " + n);
	}
}

Jeśli coś już kapujecie, to wystarczy się dobrze przyjrzeć jak działa konstruktor w języku Java. Jeżeli jednak macie problemy i stykacie się z tym po raz pierwszy, wiem z własnego doświadczenia, że jest to impuls do tego, aby się pofatygować, skopiować to sobie i skompilować. Decyzja należy do Was.

KONSTRUKTOR W JĘZYKU JAVA MOŻNA PODDAĆ PRZECIĄŻENIU!

Jeśli wiecie na czym polega przeciążanie, możecie wprowadzić wiele "wersji" także konstruktora. Aczkolwiek trzeba wiedzieć jak to robić dobrze, gdyż konstruktory wyróżniają się nie tylko zastosowaniem, ale także innym doborem słów kluczowych. Przy konstruktorach sprawa wygląda nieco inaczej i w tym miejscu na scenę wejdzie kolejne słowo kluczowe "this". Umożliwia ono odwoływanie się do tej samej klasy (do samego siebie, ale nie utożsamiać tego stwierdzenia z rekurencją!). Dużo częściej jest wykorzystywane w sytuacjach gdy przypisujemy wartości parametrów formalnych do danych składowych i powstaje między nimi kolizja nazw! Jeżeli tego nie rozumiecie, spokojnie. To też zawrę w kodzie źródłowym.

Przeciążanie konstruktorów ma takie same zastosowanie jak przeciążanie innej metody - chcemy mieć możliwość wyboru jednej z kilku "dróg" utworzenia obiektu. Chociaż cel jest identyczny, to zapis już nieco inny.

PRZYKŁAD KODU ŹRÓDŁOWEGO

Prezentuję następny program wykorzystujący omawiany manewr. W środku niego dołączyłem przeciążony konstruktor w języku Java jak również też przypadek kiedy "this" jest potrzebne w chwili przypisywania wartości danym składowym:

KLASA "MAIN"
public class Main
{
	public static void main(String[] args)
	{
		Point a = new Point();
		Point b = new Point(5, 8);

		System.out.println(a);
		System.out.println(b);
	}
}
KLASA "POINT"
public class Point
{
	private int x, y;

	public Point()
	{
		this(0, 0);
	}

	public Point(int x, int y)
	{
		setPosition(x, y);
	}

	public void setPosition(int x, int y)
	{
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString()
	{
		return "(" + x + ", " + y + ")";
	}
}

Klasa "Point" tworzy nowy punkt w układzie dwuwymiarowym. Posiada ona przeciążanie konstruktorów i tam macie pierwsze użycie słowa kluczowego "this", nie dajemy nazwy "Point" jak mogliście pomyśleć na wstępie!!! W tym przykładzie, gdy konstruktor w języku Java jest bezparametrowy, to wówczas "sięga" on do drugiego konstruktora z domyślnymi wartościami i tam wykonuje się funkcja "setPosition". Idąc jej śladem, natrafiamy na drugi sposób użycia "this" i jest on konieczny w celu rozróżnienia o jakie "x" i o jakie "y" nam chodzi. Gdybyście za nazwy parametrów dorzucili na przykład "newX" i "newY", to wtedy możecie odrzucić ten przedrostek, bo wtedy kompilator będzie wiedział jak je odróżnić. Oto dwa przypadki przy których "this" staje się potrzebne w użyciu.


Tak wygląda przeciążanie konstruktorów w przełożeniu na w miarę prosty przykład. To wszystko na ten temat. Spodziewajcie się teraz więcej artykułów o Javie bo na chwilę obecną o języku C niewiele więcej mogę napisać, a porady odnośnie tworzenia gier można wymieniać bez końca.

PODOBNE ARTYKUŁY