W czwartej części poznamy podstawy programowania obiektowego: dowiemy się, czym jest obiekt, klasa, metoda i pole składowe. Otrzymamy również rozwiązanie pracy domowej z części 3.
Rozwiązanie pracy domowej z części 3
Stwórz swój pierwszy projekt: prosty kalkulator. Najpierw wczyta on od użytkownika znak „+”, „-”, „*”, „/” lub „Q”. Następnie wczyta dwie liczby i wyświetli działanie, a później zacznie od początku. Jeśli użytkownik poda „Q”, kalkulator wyłączy się.
To zadanie mogło mieć wiele rozwiązań. Jedno z nich może wyglądać następująco:
Program ten ma wiele błędów – gdybyśmy w wyniku zamiast typu int
użyli float
lub double
, dzielenie byłoby wyświetlane poprawnie, podczas gdy teraz działanie 5/6
daje w wyniku 0. Jeśli podamy zły znak działania lub wybierzemy Q, zostanie wyświetlona liczba 0
.
Wstęp do programowania obiektowego
95% kursów programowania w dowolnym języku zaczyna część o programowaniu obiektowym słowami: Cały nasz świat jest zbudowany z obiektów. Czy słusznie? Nie wiadomo. Prawdą jest jednak, że nasz świat jest z tych obiektów zbudowany, zaś uświadomienie sobie, czym jest obiekt w prawdziwym świecie, może nam pomóc zrozumieć zasady Programowania Zorientowanego Obiektowo (Object-Oriented Programming, w skrócie OOP). Jako przykład weźmy zegarek. Istnieje mnóstwo zegarków – mogą mieć pasek plastikowy lub metalowy, godzinę mogą wskazywać w sposób analogowy bądź cyfrowy, mogą być też różnych firm. Zegarki mogą mieć różne rozmiary. Zegary mogą wisieć na ścianie, stać na stole lub być noszone na ręce. Każdy z tych zegarków jest obiektem, natomiast wszystkie te obiekty są jednej klasy: Zegarek. Podobnie, Merkury, Wenus, Ziemia i Mars są klasy Planeta, zaś jabłko, gruszka i truskawka to obiekty klasy Owoc.
Uznajmy więc, że mamy klasę Zegarek, której obiekty mogą mieć następujące cechy:
- długość paska;
- sposób wyświetlania czasu;
- nazwa firmy.
Długość paska moglibyśmy zapisać za pomocą zmiennej typu int
, sposób wyświetlania – za pomocą boolean
(np. true
, jeśli zegarek jest cyfrowy, a false
, jeśli nie). Nazwę możemy zapisać w zmiennej typu String
.
Mamy więc już schemat naszej pierwszej klasy:
Powyższy kod przedstawia kod źródłowy klasy Zegarek z trzema zmiennymi: dlugoscPaska
, czyCyfrowy
i nazwaFirmy
. Zmienne opisujące klasę są nazywane polami składowymi.
Poznaliśmy już funkcje takie, jak main(String[] args)
, println()
lub showInputDialog()
. Czy potrzebowalibyśmy jakiejś funkcji, która działa na zegarku?
Gdybyśmy chcieli sprzedać zegarek, kupiec na pewno sprawdziłby, jaka firma zrobiła zegarek. W klasie Zegarek przydałaby więc się funkcja, która podaje nazwę firmy. Rozbudujmy więc klasę zegarek o funkcję pobierzNazweFirmy()
.
Słowo String
przed nazwą funkcji określa typ zmiennej, która ma zostać przez funkcję wysłana. Wewnątrz funkcji znajduje się kod return nazwaFirmy
. Oznacza to, że po wywołaniu funkcji pobierzNazweFirmy()
otrzymamy zmienną o nazwie nazwaFirmy
. Porównaj to ze znanym Ci już kodem:
String imie = JOptionPane.showInputDialog("Podaj swoje imie");
.
Funkcja showInputDialog
w klasie JOptionPane
również ma przed nazwą słowo String
, zaś wewnątrz funkcji znajduje się słowo kluczowe return
. Funkcje znajdujące się w klasach nazywane są metodami.
Ważną metodą w obiekcie jest konstruktor. Jest to metoda uruchamiana przy tworzeniu nowego obiektu. Nie może ona nic zwracać – nie można nawet podać typu void
. Nazwa metody musi być taka sama, jak nazwa klasy.
Wewnątrz nawiasów w każdej metodzie (również w konstruktorze) mogą być podane zmienne oddzielone przecinkami. Są to tzw. argumenty. Możesz je w dowolny sposób wykorzystywać wewnątrz metody. W miejscu, gdzie wywoływana jest metoda, wewnątrz nawiasów muszą być podane wszystkie argumenty.
Przykładem jest znana ci już metoda println
. Metoda drukująca tekst wygląda następująco:
public void println(String x) {
...
}
W swoim programie możesz używać tej metody na różne sposoby – od razu wstawić tekst do środka lub wstawić tam zmienną o dowolnej nazwie.
String x = "test";
System.out.println(x);
String aaa = "aaa";
System.out.println(aaa);
System.out.println("Lorem ipsum dolor sit amet");
Przy wywołaniu metody println
, wszystkie zmienne, które podaje się w nawiasie, są przekazywane do metody println
, która może wykorzystywać zmienną w dowolny sposób.
Rozbudujmy więc nasz przykład z zegarkiem – stwórzmy konstruktor, który przyjmuje trzy argumenty: długość paska, sposób wyświetlania czasu i nazwę firmy. Dodamy również specjalną możliwość zmiany nazwy firmy (ktoś próbuje oszukiwać przy sprzedaży? Nieładnie…)
Przypominam, że funkcja, która ma w miejscu zwracanego typu podane void
, nie zwraca żadnej zmiennej, oraz że każda klasa ze słowem public
musi być zapisana w pliku o nazwie takiej samej, jak nazwa klasy. Oznacza to, że cały kod musi znajdować się w pliku o nazwie Zegarek.java
.
Teraz przejdźmy do pliku zawierającego funkcję public static void main(String[] args)
(lub stwórzmy go, jeśli takiego nie ma). Skorzystajmy teraz z efektu naszej pracy i stwórzmy obiekt klasy Zegarek. Pasek będzie miał długość 20 centymetrów, a zegarek będzie wyświetlał czas za pomocą wskazówek (więc będzie analogowy). Będzie on firmy Casio. Obiekt stworzymy w funkcji main
. Następnie spróbujemy wydrukować do konsoli nazwę firmy, a później zmienimy tą nazwę na Rolex.
Zegarek zeg = new Zegarek(20, false, "Casio");
String n = zeg.pobierzNazweFirmy();
System.out.println(n);
zeg.zmienNazweFirmy("Rolex");
n = zeg.pobierzNazweFirmy();
System.out.println(n);
W pierwszej linii tworzymy nowy obiekt klasy Zegarek
. W drugiej i trzeciej linii pobieramy nazwę firmy i wyświetlamy ją w konsoli. W czwartej linii zmieniamy nazwę firmy, zaś w piątej i szóstej znowu pobieramy nazwę firmy i wyświetlamy ją w konsoli. Najpierw wydrukowane zostanie słowo „Casio”, a później „Rolex”.
Gratulacje! Twoja pierwsza klasa została napisana. Można ją rozbudować jeszcze bardziej – dodać metody umożliwiające zmianę długości paska i sposób wyświetlania oraz umożliwiające pobranie tych danych.
To tyle w 4. części kursu!
Za tydzień:
- komentarze (aż dziwne, że dopiero teraz…);
- korzystanie z istniejących klas na przykładzie klasy
GregorianCalendar;
- czytanie dokumentacji API online, czyli sposób na zdobycie wiedzy o wszystkich funkcjach i klasach wbudowanych w język Java.
Ciekawostka:
Java 7 zawiera ponad 4000 wbudowanych klas. Każda z nich ma swój liczący co najmniej 2 akapity opis w dokumentacji. Jakby tego było mało, każda metoda w tych klasach (a metod może być naprawdę sporo) również posiada swój opis. Całość można przeczytać na stronie http://docs.oracle.com/javase/7/docs/api/index.html
Do zobaczenia 14 grudnia punktualnie o godzinie 12:00!