Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.



Podobne dokumenty
Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Wykład 4: Klasy i Metody

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Dokumentacja do API Javy.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Klasy abstrakcyjne i interfejsy

Rozdział 4 KLASY, OBIEKTY, METODY

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Języki i metody programowania Java. Wykład 2 (część 2)

Wykład 8: klasy cz. 4

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Materiały do zajęć VII

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wykład 5: Klasy cz. 3

Typy sparametryzowane

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie obiektowe

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Aplikacje w środowisku Java

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe - 1.

Podstawy programowania obiektowego

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie obiektowe zastosowanie języka Java SE

1 Atrybuty i metody klasowe

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Języki i techniki programowania Ćwiczenia 2

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie w Internecie. Java

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Aplikacje w środowisku Java

Programowanie Obiektowe i C++

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Konstruktor kopiujacy

Programowanie obiektowe

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wykład 3 Składnia języka C# (cz. 2)

Ćwiczenie 1. Przygotowanie środowiska JAVA

Programowanie obiektowe

Podstawy Programowania Obiektowego

Dziedziczenie. Tomasz Borzyszkowski

Spis treści. 1 Java T M

Programowanie obiektowe w języku

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie obiektowe

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Dziedziczenie. dr Jarosław Skaruz

Polimorfizm. dr Jarosław Skaruz

Zaawansowane programowanie w języku C++ Klasy w C++

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Szablony funkcji i klas (templates)

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Wykład 6: Dziedziczenie

Wprowadzenie do szablonów szablony funkcji

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie do szablonów szablony funkcji

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java jako język programowania

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie Obiektowe i C++

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Definicje klas i obiektów. Tomasz Borzyszkowski

Szablony funkcji i szablony klas

Wprowadzenie do programowanie obiektowego w języku C++

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie obiektowe

Wstęp do Programowania 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Język C++ zajęcia nr 2

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Programowanie, część I

Podstawy programowania III

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wstęp do programowania obiektowego. Wykład 2

Wykład 5: Więcej o Klasach i Metodach

10. Programowanie obiektowe w PHP5

Programowanie Obiektowo Zorientowane w języku c++ Konstruktory

Transkrypt:

Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class Prostokat int wysokosc, szerokosc; void wypisz() System.out.println(wysokosc + " " + szerokosc); Wykorzystajmy ją do wygenerowania prostokąta o bokach długości 7 i 3 oraz wypiszmy dane o tym prostokącie. class MAIN public static void main(string args[]) Prostokat p = new Prostokat(); p.wypisz(); Oczywistym błędem jest brak inicjalizacji pól wysokosc oraz szerokosc, czego efektem jest wydruk 0 0. Można łatwo poprawić program dopisując dwie instrukcje przypisania class MAIN public static void main(string args[]) Prostokat p = new Prostokat(); p.wysokosc = 7; p.szerokosc = 3; p.wypisz(); 1

Rozwiązanie to jednak nie uchroni nas przed ponownym zapomnieniem nadania wartości odpowiednim polom obiektu. Bardziej uniwersalnym rozwiązaniem jest wykorzystanie mechanizmów programowania obiektowego zastosowanie specjalnych metod nazywanych konstruktorami. Konstruktory wykonywane są w momencie generowania obiektów i dlatego idealnie nadają się do inicjalizowania wartości pól. Jak definiuje się konstruktory? Konstruktory są funkcjami o nazwach zgodnych z nazwami klas, w których dane konstruktory się definiuje. (Ta informacja dotyczy Javy i np. C++. W języku Pascal, konstruktory mogą mieć dowolne inne nazwy). Konstruktory nie zwracają żadnych wartości. Nie deklaruje się nawet typu void. Powróćmy do przykładu z prostokątem. Stosując powyższe wytyczne, konstruktor tej klasy może wyglądać następująco: wysokosc = wys; szerokosc = szer; Zobaczmy jak zareaguje kompilator na dodanie takiego konstruktora do klasy: javac Prostokat.java Prostokat.java:21: cannot find symbol symbol : constructor Prostokat() location: class Prostokat Prostokat p = new Prostokat(); ^ 1 error Okazuje się, że nie można utworzyć obiektu. Problem, który za chwilę okaże się zaletą, polega na tym, że tworząc obiekt uruchamiany jest konstruktor. Który? Ten przed chwilą dodany. Ponieważ posiada on dwa argumenty musimy przekazać mu dwie wartości parametry tworzonego prostokąta. Ale o to właśnie nam chodziło, aby nie zapomnieć o nadaniu wartości polom klasy. Wykorzystanie konstruktora wygląda zatem następująco: Prostokat p = new Prostokat(7,3); Konstruktor domyślny Powiedzieliśmy, że konstruktor jest funkcją wołaną automatycznie w momencie tworzenia obiektu. Co jednak się dzieje, gdy w klasie nie zdefiniowano żadnego konstruktora? Podobnie jak w C++, w takiej sytuacji kompilator generuje i dołącza do klasy bezargumentowy konstruktor domyślny umożliwiając generowanie obiektów. Jednak, w sytuacji gdy programista zdefiniuje własny konstruktor, ten domyślny nie jest generowany. Stąd pojawiły się problemy z kompilacją w przykładzie powyżej. Zwróćmy jeszcze uwagę na syntaktykę tworzenia obiektu z wykorzystaniem konstruktora bezargumentowego: 2

Prostokat p = new Prostokat(); Operator new wymaga nawiasy (), inaczej niż w C++. Podkreśla to fakt, wołania konstruktora w momencie tworzenia obiektu. Przeciążanie konstruktorów Wykorzystajmy klasę Prostokat do utworzenia kwadratu o boku 4: Prostokat k = new Prostokat(4,4); Efekt uzyskujemy poprzez powtórzenie wielkości 4. Jednak, gdyby klasa nie reprezentowała prostokąta na płaszczyźnie, ale wielokąt w wielowymiarowej przestrzeni, otrzymanie regularnej kostki wymagałoby wielokrotne powtórzenie tej samej wielkości, co może okazać się uciążliwe. Lepszym rozwiązaniem jest zdefiniowanie drugiego konstruktora, konstruktora jednoargumentowego, służącego do tworzenie regularnych kostek: wysokosc = szerokosc = a; Przy przeciążaniu konstruktorów obowiązują ogólne zasady związane z przeciążaniem funkcji, tj. listy argumentów przeciążanych funkcji muszą być różne: albo mieć różne ilości argumentów, albo różnić się typem przynajmniej jednego argumentu. Wzajemne wywoływanie się konstruktorów Zauważmy, że oba powyższe konstruktory wykonują te same czynności nadają odpowiednie wartości polom wysokosc i szerokosc. W ogólnym przypadku konstruktory mogą wykonywać inne, bardziej złożone zadania (np. w omawianym przykładzie obliczanie pola prostokąta). Jeśli założymy, że konstruktor danej klasy realizuje jakieś dodatkowe zadanie, to każdy konstruktor danej klasy powinien to zadanie realizować. Chcemy bowiem, aby funkcjonalność wszystkich konstruktorów danej klasy była dokładnie taka sama. Z drugiej strony nie chcemy implementować tego samego algorytmu wielokrotnie, w każdym konstruktorze osobno. Rozwiązaniem jest implementacja żądanego algorytmu w najbardziej ogólnym konstruktorze, tym konstruktorze, który ma dostęp do największej ilości argumentów (dwuargumentowy w naszym przykładzie), a następnie uruchomienie tego algorytmu w innym konstruktorze. Java umożliwia bowiem wzajemne wywoływanie się konstruktorów. (W C++ podobne rozwiązanie wymagało zdefiniowania innej funkcji nie będącej konstruktorem i wywołania jej we wszystkich konstruktorach danej klasy.) W jaki sposób wywołać konstruktor w innym konstruktorze tej samej klasy? W tym celu stosuje się konstrukcję this() z parametrami odpowiadającymi wywoływanemu konstruktorowi. Działa tu mechanizm przeciążania funkcji, z tą różnicą, że funkcję nie wywołuje się poprzez jej nazwę, ale poprzez słowo this. W naszym przykładzie podstawowym konstruktorem budowania prostokątów jest: wysokosc = wys; szerokosc = szer; 3

Do generowania kwadratów, możemy go użyć jako: Pewnym ograniczeniem wzajemnych wywołań konstruktorów jest fakt, że this() musi być pierwszym wywołaniem w ciele konstruktora. Wszystkie inne czynności muszą być realizowane później. Poprawnym jest zatem System.out.println("Konstruktor jednoargumentowy"); Należy pamiętać, aby nie doszło do zapętlenia się wywołań konstruktorów. Jest to kontrolowane przez kompilator Javy. Niedopuszczalne jest zatem: this(wys); Kompilator zgłasza błąd: Prostokat.java:5: recursive constructor invocation ^ 1 error 4

Kompletny przykład class Prostokat int wysokosc, szerokosc; wysokosc = wys; szerokosc = szer; void wypisz() System.out.println(wysokosc + " " + szerokosc); class MAIN public static void main(string args[]) Prostokat p = new Prostokat(7,3); p.wypisz(); Prostokat k = new Prostokat(4); k.wypisz(); Podsumowanie Konstruktory są funkcjami o nazwach zgodnych z nazwą klasy. Konstruktory nie zwracają żadnej wartości. Konstruktory można przeciążać. Konstruktory są wywoływane w momencie generowania obiektów. Konstruktory idealnie nadają się do inicjalizowania wartości pól, w tym przydziału pamięci. Konstruktor domyślny nie jest generowany, gdy w klasie zdefiniowano własny konstruktor. 5

Wywołanie this() musi być pierwszym wywołaniem w konstruktorze. Należy pilnować, aby użycie this() nie powodowało zapętlenia wywołań konstruktorów. 6