Obiektowość jest jednym z paradygmatów programowania (sposobów programowania), który ułatwia pisanie oraz utrzymanie rozbudowanych programów. Podstawowym elementem tego paradygmatu jest obiekt, który przechowuje dane (pola) ściśle z nim powiązane. Obiekt posiada również metody, które wykonują określone operacje na danych, reprezentują zachowanie obiektu.
W tym artykule poznamy jeden z najpopularniejszych paradygmatów programowania. Wiedza zawarta w artykule jest uniwersalna dla wszystkich języków umożliwiających programowanie obiektowe. Założenia są identyczne, różni się sposób zapisu.
Wpis jest kontynuacją serii, w której robię bardzo szybkie wprowadzenie w programowanie w Javie, pokazując jej najważniejsze elementy. Jeśli jakiś fragment nie zostanie omówiony, a zostanie wykorzystany w artykule, oznacza to, że został wytłumaczony w poprzednich wpisach.
Wszystkie artykuły z cyklu “Kurs Java”:
- Przygotowanie środowiska do pracy z Javą.
- Pierwszy program – zlicz ile znaków, jest w tekście.
- Scanner, wprowadzanie danych z klawiatury.
- Instrukcja warunkowa – IF
- Pętla for w języku Java
- Tablice w Javie – przechowywanie zbioru wartości
- Obiektowość – klasa, pole, metoda, obiekt
Czego potrzebujesz:
- zainstalowane JDK (instrukcja)
- 30 min wolnego czasu
Definicje – obiektowość
obiekt – unikalny element, przechowuje stan (pola) oraz zachowanie (metody), np. “Fiat, 1990, 5 999zł”
pole – unikalna informacja o obiekcie, np. marka, rok produkcji, cena
metoda – zachowanie na obiekcie, np. zmień bieg, uruchom, zatrzymaj
klasa – szablon dla obiektów, definiuje jakie pola oraz metody będą posiadały wszystkie obiekty tej samej klasy, np. Samochód
Podobnie jak w poprzednich artykułach, zróbmy założenie, które chcielibyśmy zrealizować. Niech naszym problemem, będzie przygotowanie struktury do przechowywania informacji o pojazdach (samochodach) w salonie. Jak je przechowywać ?
Klasa
Jak już wspomnieliśmy na wstępie, klasa służy do definiowania szablonu dla obiektu. Żeby zdefiniować klasę, wystarczy słowo kluczowe class, nazwa oraz klamry określające gdzie się zaczyna i kończy.
/* class NazwaKlasy { } */
Ważną informacją o klasie jest to, że każda klasa definiuje nowy typ danych. Do tej pory poznaliśmy jedynie 8 typów prostych. Od teraz, możesz definiować własne typy. Pierwszym z nich będzie typ obiektowy “Samochod”.
class Samochod { }
Póki co powiedzieliśmy, że jest samochód, teraz przydałoby się określić jaki stan (inaczej dane lub pola) będzie przechowywał obiekt takiej klasy.
Pole
Pole określa atrybut obiektu. W klasie definiujemy jakie pola będą wspólne dla wszystkich obiektów tej klasy. Pola zawsze definiujemy wewnątrz klasy, zwyczajowo na początku jej definicji, choć nie jest to konieczne. Definicja pola nie różni się od definicji zmiennej. Pole nazywamy inaczej zmienną składową.
/* typ nazwaPola; */
Zanim uzupełnimy informacje o samochodzie, poznajmy jeden z typów obiektowych dostarczanych przez Javę.
String – typ obiektowy, służy do przechowywania ciągów znaków, np.
Więcej o Stringu znajdziesz w dokumentacji Javy.
String marka = "Fiat";
Pamiętaj, aby używać cudzysłowu ” “, a nie apostrofu ‘ ‘. Apostrof w przypadku znaku (char), cudzysłów w przypadku ciągu znaków (String).
Jak już znamy Stringa, to zdefiniujmy pola w Samochodzie.
class Samochod { String marka; int rokProdukcji; double cena; }
Metoda
Metody reprezentuje zachowania obiektu. W metodach często będziemy wykonywali operacje na danych, które są przechowywane w obiekcie.
// deklaracja metody typ_zwracany nazwa([parametry]){ [return]; } // wywołanie metody nazwa(argumenty);
Deklarując metodę, musimy zastanowić się, czy metoda ma coś zwracać. Jeśli tak, to określ, jakiego będzie typu. Jeśli nie, to ustaw słowo “void”.
Drugim pytaniem, na które musimy odpowiedzieć, to czy metoda potrzebuje jakieś dodatkowe informacje, aby móc się poprawnie wykonać. Czy potrzebujemy jej przekazać dodatkowe parametry ?
Słowo kluczowe return występować będzie w przypadku gdy zdecydujemy się na jakiś typ zwracany, a więc gdy typ zwracany będzie różny od “void”.
// metoda, która nic nie zwraca i nic nie przyjmuje void przywitaj(){ System.out.println("Siema"); } // metoda, która coś zwraca i nic nie przyjmuje double pensjaJuniora(){ return 1111.11; } // metoda, która coś zwraca i coś przyjmuje int suma(int a, int b, int c){ return a+b+c; } // przykładowe wywołania metod przywitaj(); double pensja = pensjaJuniora(); int wynik = suma(1,2,3);
Zadeklarujmy metody potrzebne w Samochodzie.
class Samochod { String marka; int rokProdukcji; double cena; void uruchom(){ System.out.println("Bruummm..."); } void zmienBieg(String nazwa){ System.out.println("Zmieniam bieg na "+nazwa); } double cenaPoRabacie(double rabat){ return cena - (cena * rabat); } }
Dodajmy teraz kilka samochodów i wywołajmy metody.
class Samochod { String marka; int rokProdukcji; double cena; void uruchom(){ System.out.println("Bruummm..."); } void zmienBieg(String nazwa){ System.out.println("Zmieniam bieg na "+nazwa); } double cenaPoRabacie(double rabat){ return cena - (cena * rabat); } } class Main { public static void main(String[] args) { Samochod prywatny = new Samochod(); prywatny.cena = 222.22; prywatny.marka = "Ford"; Samochod sluzbowy = new Samochod(); sluzbowy.marka = "BMW"; sluzbowy.rokProdukcji = 1990; prywatny.uruchom(); System.out.println("Jaka jest cena po rabacie 20%? " + prywatny.cenaPoRabacie(0.2)); System.out.println("Jaka jest cena po rabacie 30%? " + sluzbowy.cenaPoRabacie(0.3)); } }
Podsumowanie
W ten sposób udało nam się przerobić wprowadzenie do obiektowości w Javie. Wiesz już jak stworzyć klasę, zdefiniować w niej pola i metody oraz jak stworzyć instancje klas, czyli obiekty. Teraz czas na Ciebie, wykonaj poniższe zadanie i sprawdź, czy umiesz.
Zadanie. Stwórz klasę przechowującą informacje o Budynku (nazwa, rok budowy, liczba pięter). Przygotuj metodę wyświetlającą wszystkie informacje o budynku, oraz metodę obliczającą ile lat ma budynek (rok obecny możesz ustawić na sztywno). Stwórz kilka obiektów (budynków), ustaw im wartości i wywołaj dla nich metody.
Powodzenia 😀
W razie pytań pisz, chętnie pomogę.
Cześć Tomek,
Cel udało się osiągną, brawo 🙂 choć kod nieco bym zmienił.
widać, że używasz konstrukcji, które nie zostały użyte w tym mini kursie. A więc get/set oraz LocaDate.
W Javie popularniejszym podejściem w nazwach jest CamelCase.
Jeśli budynek przechowuje informacje o “data_budowy”, to metoda getData_budowy powinna zwracać informację o dacie budowy. W Metodzie o nazwie “getData_budowy” obecnie zwracasz informację o tym ile lat ma budynek, zmieniłbym nazwę tej metody, aby nie wprowadzała w błąd.
Do get/set na razie się nie odniosę, ze względu na to, że nie było omawiane w poprzednich materiałach.(get/set idzie zawsze w parze z prywatnymi polami)
Konstruktor ok 🙂
Brakuje oczywiście kodu wywołującego. Ale mogę się domyślić jak wygląda.
Ja wiem, że to zabrzmi śmiesznie ale założenie wykorzystania LocalDate było takie aby wiek budynku zawsze obliczał się zgodnie z bieżącym rokiem. Przerost formy nad treścią? Zapewne, ale mam satysfakcja, że zadziałało coś innego niż metoda na “intach” 🙂
Bardzo fajny wpis, widziałem ostatnio podobne artykuły i ten się wyróżnia na tle innych oraz jest wart uwagi. Konkretnie objaśniony temat. Bardzo przyjemnie się go czyta. Czekam na takich więcej 🙂