Konstruktory w języku Java

W języku Java konstruktorykonstruktorkonstruktory pełnią funkcję zgodną z założeniami programowania obiektowego. Konstruktor to metoda wywoływana w trakcie tworzenia obiektuobiektobiektu, najczęściej służąca do nadania początkowych wartości polom w klasie. Każda klasaklasaklasa ma swój domyślny, pusty konstruktor, który nie zmienia żadnych pól. W przypadku, kiedy programista definiuje własny konstruktor, ten domyślny znika – może jednak zostać dodany ręcznie. Konstruktory mają dwie cechy specjalne, które wyróżniają je na tle innych metod:

  • nazwy konstruktorów są zawsze takie same, jak nazwa klasy, w której się znajdują,

  • konstruktory nie zwracają żadnej wartości.

Zdefiniowany w języku Java konstruktor należący do klasy Czlowiek:

Linia 1. class Czlowiek. Linia 2. otwórz nawias klamrowy. Linia 3. prawy ukośnik asterysk Pola asterysk prawy ukośnik. Linia 5. String imie średnik. Linia 6. String nazwisko średnik. Linia 7. int wiek średnik. Linia 10. prawy ukośnik asterysk Konstruktor asterysk prawy ukośnik. Linia 12. Czlowiek otwórz nawias okrągły String kon podkreślnik imie przecinek String kon podkreślnik nazwisko przecinek int kon podkreślnik wiek zamknij nawias okrągły. Linia 13. otwórz nawias klamrowy. Linia 14. imie znak równości kon podkreślnik imie średnik. Linia 15. nazwisko znak równości kon podkreślnik nazwisko średnik. Linia 16. wiek znak równości kon podkreślnik wiek średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy.
Ważne!

Zwróć uwagę, że w języku Java definicji klasy nie kończy się znakiem średnika (;) po ostatnim prawym nawiasie klamrowym.

Samodzielnie zdefiniowane konstruktory ułatwiają przypisywanie wartości polom obiektu. Przedstawiony konstruktor Czlowiek() można dodatkowo ulepszyć.

Obecnie musimy nadać nazwy argumentom, których wartości zostaną przypisane odpowiednim polom (przykładowo: argument o nazwie kon_imie odpowiada polu imie). Wprowadza to bałagan w kodzie.

Usuniemy tę niedogodność, używając w definicji konstruktora specjalnej referencji this. Wskazuje ona obiekt, dla którego wywołana została metoda (w przypadku wywołania konstruktora będzie to powstająca właśnie instancja klasy Czlowiek).

Zmodyfikujmy zatem klasę Czlowiek:

Linia 1. class Czlowiek. Linia 2. otwórz nawias klamrowy. Linia 3. prawy ukośnik asterysk Pola asterysk prawy ukośnik. Linia 5. String imie średnik. Linia 6. String nazwisko średnik. Linia 7. int wiek średnik. Linia 10. prawy ukośnik asterysk Konstruktor asterysk prawy ukośnik. Linia 12. Czlowiek otwórz nawias okrągły String imie przecinek String nazwisko przecinek int wiek zamknij nawias okrągły. Linia 13. otwórz nawias klamrowy. Linia 14. this kropka imie znak równości imie średnik prawy ukośnik prawy ukośnik zasada jest cały czas taka sama minus zamknij nawias ostrokątny apostrof nazwa podkreślnik obiektu kropka nazwa podkreślnik pola apostrof. Linia 15. this kropka nazwisko znak równości nazwisko średnik. Linia 16. this kropka wiek znak równości wiek średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy.

Konstruktor wygląda bardziej czytelnie niż poprzednio, a działa tak samo.

Warto wspomnieć, że definicje klas w języku Java mogą zawierać wiele konstruktorów. Muszą się one jednak różnić albo liczbą przyjmowanych argumentów, albo ich typem. Właśnie na podstawie liczby lub typu argumentów program dobiera odpowiedni konstruktor podczas tworzenia obiektu.

Pamiętajmy, że konstruktor domyślny tworzony automatycznie (chociaż może on zostać zdefiniowany manualnie), nie ma żadnych argumentów. Oto jego budowa:

Linia 1. Czlowiek otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy zamknij nawias klamrowy prawy ukośnik prawy ukośnik konstruktor domyślny klasy apostrof Czlowiek apostrof.

Destruktory

W języku Java nie używa się destruktorówdestruktordestruktorów, czyli metod wywoływanych przez program w celu usunięcia obiektu z pamięci. Wynika to z faktu, że stosuje się w nim szczególną metodę zarządzania pamięcią.

W przypadku języków niskopoziomowych zarządzaniem pamięcią zajmuje się programista. Właśnie on jest odpowiedzialny między innymi za usuwanie niepotrzebnych obiektów z pamięci.

Natomiast po uruchomieniu programu napisanego w języku Java zarządzaniem pamięcią zajmuje się wirtualna maszyna Javy (JVM, ang. Java Virtual Machine), a ściślej mówiąc tzw. garbage collectorgarbage collectorgarbage collector. Wirtualna maszyna zapobiega wyciekom pamięci, czyli niezamierzonemu zajmowaniu pamięci komputera.

Mechanizm ten jest bardzo wygodny, ponieważ przejmuje część zadań, które musiałby wykonać programista. Z drugiej strony ceną za to jest spowolnienie działania programów (w porównaniu z ich odpowiednikami napisanymi w językach z ręcznym zarządzaniem pamięcią). Obecnie to się zmienia: aplikacje Javy coraz mniej ustępują w szybkości programom utworzonym w językach, w których nie stosuje się automatycznego zarządzania pamięcią.

Mimo wszystko usuwanie niepotrzebnych obiektów jest uważane za dobry nawyk programisty.

Przykład

Zdefiniujmy w języku Java klasę, która będzie zawierać wszystkie omówione elementy. Załóżmy, że jej obiekty mają służyć do opisania smartfonów w sklepie ze sprzętem elektronicznym.

Tworzymy puste ciało klasy Smartfon:

Linia 1. public class Smartfon prawy ukośnik prawy ukośnik znaczenie operatora apostrof public apostrof zostanie wytłumaczone wkrótce. Linia 2. otwórz nawias klamrowy. Linia 4. zamknij nawias klamrowy.

Definiujemy pola, które będą wchodzić w skład obiektów powstającej klasy (przykładowo: marka, model, cena i opis).

Linia 1. public class Smartfon. Linia 2. otwórz nawias klamrowy. Linia 3. prawy ukośnik asterysk Pola asterysk prawy ukośnik. Linia 5. public String marka średnik. Linia 6. public String model średnik. Linia 7. public double cena średnik. Linia 8. public String opis średnik. Linia 9. zamknij nawias klamrowy.
Ważne!

Słowo kluczowe public oznacza, że pola klasy Smartfon są publiczne i dostępne z innych klas i pakietów. Można je modyfikować i odczytywać bezpośrednio z innych miejsc w programie.

W przyszłości będziemy tworzyć obiekty mające wstępnie przypisane wartości pól, dlatego przygotujemy odpowiedni konstruktor.

Linia 1. public class Smartfon. Linia 2. otwórz nawias klamrowy. Linia 3. prawy ukośnik asterysk Pola asterysk prawy ukośnik. Linia 5. public String marka średnik. Linia 6. public String model średnik. Linia 7. public double cena średnik. Linia 8. public String opis średnik. Linia 11. prawy ukośnik asterysk Konstruktor asterysk prawy ukośnik. Linia 13. public Smartfon otwórz nawias okrągły String marka przecinek String model przecinek double cena przecinek String opis zamknij nawias okrągły. Linia 14. otwórz nawias klamrowy. Linia 15. this kropka marka znak równości marka średnik. Linia 16. this kropka model znak równości model średnik. Linia 17. this kropka cena znak równości cena średnik. Linia 18. this kropka opis znak równości opis średnik. Linia 19. zamknij nawias klamrowy. Linia 20. zamknij nawias klamrowy.

Na koniec definiujemy metodę pozwalającą wyświetlać informacje na temat każdego smartfona:

Linia 1. public class Smartfon. Linia 2. otwórz nawias klamrowy. Linia 3. prawy ukośnik asterysk Pola asterysk prawy ukośnik. Linia 5. public String marka średnik. Linia 6. public String model średnik. Linia 7. public double cena średnik. Linia 8. public String opis średnik. Linia 11. prawy ukośnik asterysk Konstruktor asterysk prawy ukośnik. Linia 13. public Smartfon otwórz nawias okrągły String marka przecinek String model przecinek double cena przecinek String opis zamknij nawias okrągły. Linia 14. otwórz nawias klamrowy. Linia 15. this kropka marka znak równości marka średnik. Linia 16. this kropka model znak równości model średnik. Linia 17. this kropka cena znak równości cena średnik. Linia 18. this kropka opis znak równości opis średnik. Linia 19. zamknij nawias klamrowy. Linia 21. prawy ukośnik asterysk Metody asterysk prawy ukośnik. Linia 23. public void wypisz podkreślnik info otwórz nawias okrągły zamknij nawias okrągły. Linia 24. otwórz nawias klamrowy. Linia 25. System kropka out kropka println otwórz nawias okrągły cudzysłów Marka dwukropek cudzysłów plus marka zamknij nawias okrągły średnik. Linia 26. System kropka out kropka println otwórz nawias okrągły cudzysłów Model dwukropek cudzysłów plus model zamknij nawias okrągły średnik. Linia 27. System kropka out kropka println otwórz nawias okrągły cudzysłów Cena dwukropek cudzysłów plus cena zamknij nawias okrągły średnik. Linia 28. System kropka out kropka println otwórz nawias okrągły cudzysłów Opis dwukropek cudzysłów plus opis zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 30. zamknij nawias klamrowy.

Słownik

garbage collector
garbage collector

jedna z metod automatycznego zarządzania dynamicznie przydzielaną pamięcią; za proces jej zwalniania odpowiedzialny jest programowy zarządca zwany w skrócie GC

klasa
klasa

zdefiniowany przez programistę złożony typ zmiennej, która może zawierać metody oraz pola danych

konstruktor
konstruktor

specjalna metoda danej klasy, którą wywołuje się podczas tworzenia jej instancji; zadaniem konstruktora jest zainicjowanie obiektu, a w niektórych językach programowania także utworzenie obiektu

destruktor
destruktor

przeciwieństwo konstruktora; specjalna metoda, wywoływana przez program przed usunięciem obiektu

obiekt
obiekt

pojedyncza instancja pewnej klasy, czyli zmienna o jej typie; struktura zawierająca dane oraz metody (funkcje służące do wykonywania na tych danych określonych zadań)