Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.49 KB | None | 0 0
  1. Metody i konstruktory
  2.  
  3. Czego się dowiesz
  4. Czym jest metoda
  5. Co to jest konstruktor
  6. Jak powyższe wpływają na strukturę kodu Twojej aplikacji
  7. Wstęp teoretyczny
  8. Z poprzedniej lekcji wiesz już, że w Javie możemy tworzyć własne, obiektowe typy danych, które przechowują pewne informacje. W definicji programowania obiektowego zaznaczyliśmy jednak, że obiekty mogą łączyć w sobie nie tylko stan (zestaw cech), ale także funkcjonalności.
  9.  
  10. W Javie każda klasa oprócz pól (zmiennych) może także zmieniać swój wewnętrzny stan, a także wywoływać różne instrukcje poprzez tak zwane metody. Pierwszą z nich jaką już poznałeś jest metoda main(String[] args), od której rozpoczyna się działanie każdej aplikacji. Nic jednak nie stoi na przeszkodzie, aby zdefiniować więcej metod i uczynić nasz kod bardziej czytelnym. Podstawowa definicja metody wygląda następująco:
  11.  
  12. 1
  13. typ_zwracany_metody nazwa_metody(opcjonalne_parametry) { }
  14. Metoda może zwracać w wyniku swojego działania pewien wynik - wtedy musimy powiedzieć kompilatorowi jakiego typu on będzie (np. metoda może zwrócić wynik dodawania dwóch liczb podanych jako argumenty). Metoda może jednak również nie zwracać żadnego wyniku (np. będzie odpowiedzialna tylko za wyświetlenie pewnych informacji), wtedy zamiast typu zwracanego podajemy słowo kluczowe void. Jak widzisz nazwa metody w odróżnieniu od pól klasy posiada również okrągłe nawiasy() oraz ciało w nawiasach klamrowych {}. W nawiasach okrągłych możemy podać argumenty metody, czyli zestaw zmiennych, na których możemy operować we wnętrzu metody.
  15.  
  16. Jeśli metoda zwraca jakiś wynik, to ostatnią instrukcją jaka się w niej wykona musi być zwrócenie wartości za pomocą słowa kluczowego return.
  17.  
  18.  
  19.  
  20. Przykład
  21. Wróćmy na chwilę do naszych motoryzacyjnych przykładów. Użyjemy jeszcze raz tej samej klasy Car co poprzednio, ale w celu wygodniejszego tworzenia obiektów samochodów utworzymy dodatkową klasę "fabrykę" o nazwie CarFactory, która będzie posiadała tylko jedną metodę odpowiedzialną za zwrócenie gotowego obiektu typu Car.
  22.  
  23. Do klasy Car z kolei dodajmy metodę printInfo(), która w zwięzłej formie wyświetli informacje dotyczące konkretnego egzemplarza.
  24.  
  25. Car.java
  26.  
  27. class Car {
  28. int doors;
  29. String carColor;
  30. String wheelsColor;
  31. String tiresColor;
  32. String brand;
  33. String model;
  34.  
  35. void printInfo() {
  36. String info = "";
  37. info = info + brand+" ";
  38. info = info + model+", ";
  39. info = info + "kolor: " + carColor + ", " ;
  40. info = info + "drzwi: " + doors + ", " ;
  41. info = info + "felgi: " + wheelsColor +", ";
  42. info = info + "opony: " + tiresColor;
  43.  
  44. System.out.println(info);
  45. }
  46. }
  47. Ulepszona klasa Car potrafi już wyświetlać informacje o sobie. Zmienna info jest opcjonalna, wykorzystaliśmy ją dla poprawy czytelności. Jak widzisz metoda jest typu void ponieważ metoda nie zwraca wyniku, a jedynie wyświetla coś na ekranie.
  48.  
  49. CarFactory.java
  50.  
  51. class CarFactory {
  52. /*
  53. * Metoda createCar() przyjmuje parametry opisujące egzemplarz nowego
  54. * samochodu i zwraca gotowy obiekt typu Car
  55. */
  56. Car createCar(String carBrand, String carModel, int doorsNumber,
  57. String color, String wheels, String tires) {
  58.  
  59. // tworzymy nowy obiekt typu Car
  60. Car car = new Car();
  61.  
  62. // przypisujemy parametry, które podaliśmy jako parametry metody
  63. car.brand = carBrand;
  64. car.model = carModel;
  65. car.doors = doorsNumber;
  66. car.carColor = color;
  67. car.wheelsColor = wheels;
  68. car.tiresColor = tires;
  69.  
  70. // zwracamy utworzony egzemplarz klasy car za pomocą słowa return
  71. return car;
  72. }
  73. }
  74. Klasa CarFactory posiada tylko jedną metodę i sama w sobie nie przechowuje żadnych informacji. Jej zadaniem jest zwracanie nowych obiektów typu Car, według zdefiniowanych parametrów, które przekazujemy jako argumenty metody. Jak widzisz przenieśliśmy w to miejsce większość logiki, która do tej pory znajdowała się bezpośrednio w klasie CarShop (co było bez sensu, bo przecież samochody produkuje się w fabryce, a nie w sklepie). Jeżeli będziesz kontynuować swoją przygodę z programowaniem, to w przyszłości dowiesz się, że podobne klasy są rzeczywiście wykorzystywane i są tzw. wzorcem projektowym o nazwie factory method.
  75.  
  76. Wracając jednak do sedna... Jak powiedzieliśmy metoda createCar(...) zwraca nowy obiekt typu Car, dlatego musieliśmy w tym przypadku zapisać Car createCar(...). To jednak nie wszystko, bo po samym utworzeniu obiektu wewnątrz metody musimy go jeszcze faktycznie zwrócić i robimy to przy pomocy słowa kluczowego return, które musi być ostatnią wykonaną instrukcją danej metody. Ważne jest to, że zwracany obiekt musi być zgodny z typem zadeklarowanym (czyli, jeśli metoda jest typu Car, to musi zwracać obiekt Car, jeśli będzie zadeklarowana jako int, to musi zwrócić liczbę typu int lub nie większą od niej).
  77.  
  78. Dzięki powyższym zapisom tworzenie i wyświetlanie informacji o samochodach w sklepie staje się już bardzo proste i mieści się z zaledwie kilku linijkach kodu.
  79.  
  80. CarShop.java
  81.  
  82. public class CarShop {
  83.  
  84. public static void main(String[] args) {
  85. CarFactory cf = new CarFactory();
  86. Car audiA4 = cf.createCar("Audi", "A4", 5, "Czarny", "Białe", "Czarne");
  87. Car vwPassat = cf.createCar("Volkswagen", "Passat", 5, "Niebieski", "Srebrne", "Czarne");
  88.  
  89. audiA4.printInfo();
  90. vwPassat.printInfo();
  91. }
  92. }
  93. Pierwszą rzeczą jaką robimy jest utworzenie obiektu fabryki typu CarFactory, który będzie dla nas produkował nowe egzemplarze samochodów. Dalej utworzyliśmy dwie zmienne typu Car o nazwach audiA4 i vwPassat - jak widzisz tworzenie samochodu jest teraz bardzo proste i mieści się w 1 linii. Wystarczy wywołać metodę za pomocą operatora kropki (w podobny sposób jak odwoływaliśmy się do pól obiektu). Nasz kod stał się dużo bardziej uniwersalny.
  94.  
  95. Równie łatwe jest wyświetlanie informacji o samochodzie, ponieważ zajmuje się tym metoda printInfo() zdefiniowana w klasie Car.
  96.  
  97. Pamiętaj, że jeżeli będziesz chciał wywołać metodę na pustym obiekcie (null) otrzymasz błąd NullPointerException.
  98.  
  99.  
  100.  
  101. Konstruktory
  102. Powyższy kod znacznie ułatwił nam sprawę, jednak część osób może się zastanawiać (i słusznie), czy nie dałoby się tego zrobić jeszcze łatwiej? Czy nie dałoby się jednak pominąć klasy fabryki i tworzyć samochodów bezpośrednio w klasie Car?
  103.  
  104. Otóż odpowiedź brzmi - tak, da się tworzyć samochody poza naszą fabryką, zachowując przy tym uniwersalność kodu. Służą do tego specjalne metody, które nazywać będziemy konstruktorami (konstruowanie = tworzenie obiektu).
  105.  
  106. Konstruktor nie ma żadnego typu zwracanego, co więcej nie podajemy w tym przypadku nawet słowa void! Dodatkowo musi mieć on dokładnie taką samą nazwę jak klasa, a także podobnie jak każda metoda może przyjmować dowolne parametry. Schematyczny zapis:
  107.  
  108. 1
  109. NazwaKlasy(opcjonalne_parametry...) { }
  110. Konstruktor będzie wywołany podczas tworzenia obiektu, czyli przy wywołaniu new NazwaKlasy();.
  111.  
  112. Powyższy kod możemy teraz sprowadzić tylko do dwóch klas:
  113.  
  114. Car - przechowuje informacje o samochodzie, wyświetla je metodą i potrafi utworzyć samochód w konstruktorze
  115. CarShop - zarządza samochodami
  116. Car.java
  117.  
  118. class Car {
  119. int doors;
  120. String carColor;
  121. String wheelsColor;
  122. String tiresColor;
  123. String brand;
  124. String model;
  125.  
  126. //Konstruktor
  127. Car(String carBrand, String carModel, int doorsNumber,
  128. String color, String wheels, String tires) {
  129.  
  130. // przypisujemy parametry, które podaliśmy jako argumenty konstruktora
  131. brand = carBrand;
  132. model = carModel;
  133. doors = doorsNumber;
  134. carColor = color;
  135. wheelsColor = wheels;
  136. tiresColor = tires;
  137. }
  138.  
  139. void printInfo() {
  140. String info = "";
  141. info = info + brand+" ";
  142. info = info + model+", ";
  143. info = info+ "kolor: " + carColor + ", " ;
  144. info = info+ "drzwi: " + doors + ", " ;
  145. info = info+ "felgi: " + wheelsColor +", ";
  146. info = info+ "opony: " + tiresColor;
  147.  
  148. System.out.println(info);
  149. }
  150. }
  151. Do klasy Car dodaliśmy tym razem konstruktor, który przyjmuje wszystkie parametry niezbędne do utworzenia nowego obiektu typu samochód. Trzeba w tym miejscu podkreślić, że konstruktorów możesz utworzyć tyle ile chcesz, jednak każdy z nich musi przyjmować różne argumenty lub nie przyjmować ich wcale. Jeżeli w klasie nie jest zdefiniowany żaden konstruktor, to kompilator automatycznie (niejawnie) stworzy sobie konstruktor domyślny - dlatego możliwe było użycie konstrukcji new Car() pomimo iż do tej pory w klasie tej żadnego konstruktora przecież nie było. Pamiętaj jednak, że jeśli zdefiniujesz co najmniej jeden konstruktor, to konstruktor domyślny przestanie istnieć.
  152.  
  153. CarShop.java
  154.  
  155. public class CarShop {
  156.  
  157. public static void main(String[] args) {
  158. Car audiA4 = new Car("Audi", "A4", 5, "Czarny", "Białe", "Czarne");
  159. Car vwPassat = new Car("Volkswagen", "Passat", 5, "Niebieski", "Srebrne", "Czarne");
  160.  
  161. audiA4.printInfo();
  162. vwPassat.printInfo();
  163. }
  164. }
  165. Jak widzisz, całość udało się tym razem zmieścić w dwóch klasach, pozostając przy bardzo dużej uniwersalności kodu i wygodzie tworzenia nowych obiektów.
  166.  
  167. W celu uruchomienia powyższych przykładów uruchamiamy polecenia javac CarShop.java i java CarShop. Zarówno w pierwszym przypadku z dodatkową klasą fabryki, jak i w przykładzie z konstruktorami otrzymujemy wynik:
  168.  
  169. Metody i konstruktory
  170.  
  171. Lekcja ta jest bardzo ważna i musisz z niej zapamiętać, że:
  172.  
  173. W klasach możemy definiować metody, które mogą zwracać pewien wynik. Jeśli nic nie zwracają to musimy użyć słowa void. Jeśli metoda ma zwrócić wynik to ostatnią instrukcją musi być return.
  174. Konstruktory służą do tworzenia nowych obiektów, muszą mieć taką samą nazwę jak nazwa klasy i nic nie zwracają ani nie mają typu void
  175. Zarówno metody jak i konstruktory mogą przyjmować dowolne argumenty typów znanych kompilatorowi
  176. Bardzo ważne jest abyś dokładnie i samodzielnie wykonał zadania do tego tematu i przeanalizował rozwiązania. Niezrozumienie tej lekcji może w bardzo dużym stopniu wpłynąć na problemy ze zrozumieniem kolejnych materiałów.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement