Aplikacje w środowisku Java - wykład 1

Podobne dokumenty
Programowanie w Javie - wykład 3

Programowanie w środowisku graficznym- wykład 2 Java - Klasy

JAVA- wykład 2 Klasy

Programowanie w Javie - wykład 2

Programowanie w Javie - wykład 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Java-wykład. Dorota Pylak

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

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

Dorota Pylak. Aplikacje w Javie- wykład 1

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

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

Programowanie w Internecie. Java

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe

Definiowanie własnych klas

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

Dziedziczenie. dr Jarosław Skaruz

Dokumentacja do API Javy.

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

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Dziedziczenie. Tomasz Borzyszkowski

Programowanie obiektowe

Wykład 4: Klasy i Metody

Rozdział 4 KLASY, OBIEKTY, METODY

Podstawy i języki programowania

Java Język programowania

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Wykład 2: Podstawy Języka

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

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

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

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie w Javie wykład 8 Interfejsy

Wprowadzenie do języka Java

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

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Podstawowe części projektu w Javie

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Wykład 8: klasy cz. 4

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

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

Polimorfizm. dr Jarosław Skaruz

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

Wykład 7: Pakiety i Interfejsy

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

Enkapsulacja, dziedziczenie, polimorfizm

TEMAT : KLASY DZIEDZICZENIE

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Definicje klas i obiektów. Tomasz Borzyszkowski

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

Programowanie obiektowe

Technologie i usługi internetowe cz. 2

Kurs WWW. Paweł Rajba.

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

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

2. Składnia, środowisko i konwencje w Javie

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. 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;

Aplikacje w środowisku Java

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

KOTLIN. Język programowania dla Androida

Programowanie obiektowe

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

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

Multimedia JAVA. Historia

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

Podstawy programowania skrót z wykładów:

Kompozycja i dziedziczenie klas

1 Atrybuty i metody klasowe

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Tworzenie aplikacji w języku Java

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

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

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

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

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

Programowanie obiektowe i zdarzeniowe

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

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

Aplikacje w środowisku Java

Szablony klas, zastosowanie szablonów w programach

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

Materiały do zajęć VII

Interfejsy i klasy wewnętrzne

Podstawy Języka Java

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

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Programowanie obiektowe

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Programowanie w Javie wykład 9 Klasy wewnętrzne, klasy anonimowe Klasy opakowujące

Podstawy programowania obiektowego

Transkrypt:

Aplikacje w środowisku Java - wykład 1 Java-podstawy powtórzenie Treści prezentowane w wykładzie zostały oparte o: Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 http://docs.oracle.com/javase/8/docs/ http://docs.oracle.com/javase/10/docs/ C. S. Horstmann, G. Cornell, Java. Podstawy, Helion, Gliwice 2013 Dorota Pylak C. S. Horstmann, Java, Techniki zaawansowane(wydanie10), Helion, Gliwice 2017

Java to uniwersalny język programowania składniowo podobny do C/C++ Java jest językiem obiektowym. Wszystko, z czym mamy do czynienia w programie jest obiektem jakiejś klasy (poza kilkoma typami podstawowymi). W ten sposób podejście obiektowe do programu jest niejako wymuszone. Obiekty w programie odzwierciedlają rzeczywiste obiekty (konkretne lub abstrakcyjne) i charakteryzują się cechami (atrybutami, polami) operacjami, które można na nich wykonywać (metodami) KLASA to opis cech grupy podobnych obiektów, które są dla nich niezmienne. 2

PIERWSZY PROGRAM 3 public class Test{ public static void main(string[] args){ System.out.println( Witaj Javo ); Zauważmy, że program w Javie zawsze składa się z definicji klasy. Do definiowania klas służy słowo kluczowe class, po nim podajemy nazwę klasy. Definicję klasy (pola i metody) podajemy w występujących potem nawiasach {. W klasie Test zdefiniowano metodę main, wykonanie programu zaczyna się właśnie od tej metody.

PIERWSZY PROGRAM public static void main(string[] args) Jest to nagłówek funkcji o nazwie main i następujących modyfikatorach: public oznacza, że funkcja jest publiczna, tzn. dostępna z zewnątrz klasy. Musi taka być, aby JVM działająca na zewnątrz klasy mogła ją uruchomić static funkcja jest statyczna, tzn. może być wywołana dla klasy, nie tylko dla konkretnego jej obiektu. Dzięki temu JVM nie musi tworzyć obiektu naszej klasy, może po prostu wywołać jej metodę main. Tę właśnie metodę JVM próbuje wywołać zawsze kiedy uruchamiamy ją poleceniem java JakasKlasa. Słowo void nie jest modyfikatorem, ale typem zwracanym przez funkcję. Oznacza ono pusty, bez wyniku. 4

PIERWSZY PROGRAM 5 public static void main(string[] args){ System.out.println( Witaj Javo ); W nawiasach widzimy String[]. Jest to tablica elementów klasy String służącej do przechowywania łańcuchów znakowych (napisów). Tablica ta zawiera parametry wywołania programu (np. z linii poleceń) Za wypisywanie na standardowe wyjście odpowiadają metody obiektu out będącego polem statycznym standardowej klasy System odpowiadającej za komunikację z systemem. Obiekt out posiada m.in. metodę println(string s), która wypisuje przekazany jej obiekt klasy String, po czym przechodzi do nowej linii Witaj Javo to stała łańcuchowa typu String

PIERWSZY PROGRAM 6 Zapisujemy program w pliku źródłowym Test.java Zapisany program kompilujemy za pomocą javac Test.java (lub w IDE) Otrzymujemy plik binarny Test.class Uruchamiamy program w IDE lub pisząc java Test (uruchamiając maszynę wirtualną polecenie java, podajemy jako argument samą nazwę klasy w której zdefiniowana jest metoda main, bez rozszerzenia.class)

TYPY PODSTAWOWE TYP Rozmiar Zakres Klasa opakowująca Całkowitoliczbowe byte 8 bitów -128 : 127 Byte short 16-32768 : 32767 Short int 32-2 mld : 2 mld Integer long 64-9 tryl. : 9 tryl. Long Zmiennoprzecinkowe float 32-3.4E38...+3.4E38 Float double 64-1.7E308...1.7E308 Double Znakowy char 16 \u0000 : \u8fff Character Logiczny boolean - true:false Boolean Pusty void - - Void 7

ZMIENNE 8 Zmienna to nazwana część pamięci służąca do przechowywania informacji Deklaracja zmiennej nazwa_typu nazwa_zmiennej; Inicjacja zmiennej nazwa_typu nazwa_zmiennej=wyrażenie; Deklaracja stałych. (Wartość stałej można ustalić tylko raz) final nazwa_typu nazwa_stałej[=wyrażenie]; Konwencje nazewnicze nazwy zmiennych, metod zaczynamy mała literą, a następnie każdy składnik wyróżniamy dużą literą np. polefigury nazwy klas każdy składnik dużą literą np. StringBuilder nazwy stałych kapitalikami np. PI

ZMIENNE var 9 Od Java 10 w przypadku deklaracji zmiennej lokalnej występującej razem z inicjalizacją można zastosować mechanizm konkludowania typów i zamiast nazwa_typu wpisać słowo kluczowe var var mojfajnyobiekt = new MojaSuperFajnaKlasa(); //zamiast MojaSuperFajnaKlasa mojfajnyobiekt = new MojaSuperFajnaKlasa(); Typ jest konkludowany na podstawie wyrażenia inicjującego var value = "abcd"; //value jest Stringiem

10 OPERATORY: = == Przypisania i porównania działają nie bezpośrednio na obiektach, ale na referencjach. Przykład 1 String s1 = "coś", s2 = "co"; s2 += "ś"; System.out.println(s1 + " == " + s2 + ": " + (s1 == s2)); // wypisze "coś == coś: false" // s1 i s2 to takie same napisy, // ale operator == sprawdza, // czy są to te same napisy

11 OPERATOR == Do porównywania obiektów (wartości, nie referencji) służy metoda equals(). Przypisanie wartości jest bardziej skomplikowaną sprawą. Przykład użycia metody equals(): String s1 = "coś", s2 = "co"; s2 += "ś"; System.out.println(s1 + "==" + s2 + (s1.equals(s2))); // wypisze "coś == coś: true"

12 OPERATOR == Przykład 2 String s1="test"; String s2="test"; String s3=new String("test"); System.out.println(s1 == s2); //true -because both refer to same instance in // Java String Pool -the special memory region // where Strings are stored by the JVM. System.out.println(s1 == s3); //false(because s3 refers to instance // created in nonpool) System.out.println(s1.equals(s2));//true System.out.println(s1.equals(s3));//true

13 OPERATORY = Przykład 3 class Test { public int i; public static void main(string[] args) { Test t1, t2; t1 = new Test(); // inicjalizacja t2 = t1; t1.i = 1; t2.i = 2; System.out.println(t1.i); // wypisze 2 Po przypisaniu t2 = t1 zmienne t1 i t2 reprezentują ten sam obiekt. Jeden obiekt.

OPERATOR KONWERSJI TYPU Zmiana typu wyrażenia- konwersja (rzutowanie) Operator konwersji (rzutowania) ma postać: (nazwa_typu) wyrażenie gdzie nazwa_typu oznacza typ do jakiego jest przekształcany aktualny typ wyrażenia int n=7; double x=(double)n/5;//dzielenie rzeczywiste W trakcie obliczania wartości wyrażeń arytmetycznych dokonywane są automatyczne konwersje (promocje numeryczne) Dla operatorów dwuargumentowych: Jeśli jeden z argumentów jest typu double, to drugi jest przekształcany do double W przeciwnym razie, jeśli jeden jest float, to drugi konwertuje się do float W przeciwnym razie, jeśli jeden jest long, to drugi do long W przeciwnym razie, oba argumenty są konwertowane do int 14

INSTRUKCJE STERUJĄCE 15 Instrukcje sterujące występujące w Javie są bardzo podobne do tych znanych z języka C/C++. Istnieje właściwie tylko jedna ważna różnica: Java nie pozwala na użycie liczby tam, gdzie oczekuje wartości logicznej. Każde wyrażenie logiczne, (np. a==b) jest typu boolean.

16 for-each for(typ zm : zestaw) instrukcja; Pętla for-each wykonuje instrukcje, dla każdego elementu zestawu. Pętla ta służy do przebiegania po zestawach danych (np. kolekcjach, tablicach, plikach). Przykład: String[]alfabet={ a, b, c, d, e ; for(string s: alfabet) System.out.println(s); //wypisze w kolejnych wierszach a,b,c,d,e.

switch 17 Instrukcja switch zwana czasem instrukcją wielokrotnego wyboru. Na podstawie wartości wyrażenia wyr wybiera i wykonuje odpowiedni fragment kodu. Wyrażenie wyr może być jednego z typów całkowitych lub typu char, Character, String lub dowolnego typu wyliczeniowego (enum). (Jeśli wyr jest typu referencyjnego, to do porównania używana jest metoda equals()) switch(wyr){ case wyr_stale_1: instrukcja1; break; case wyr_stale_2: instrukcja2; break;... case wyr_stale_k: instrukcjak; break; default: instrukcja_domyslna;

18 switch int day = 2; String daytype; switch (day) { // multiple cases without break statements case 1: case 2: case 3: case 4: case 5: daytype = "Weekday"; break; case 6: case 7: daytype = "Weekend"; break; default: daytype = "Invalid daytype"; System.out.println("day " + day + " is a " + daytype);

19 switch Java 13 int day = 2; String daytype; switch (day) { // multiple values in a case case 1, 2, 3, 4, 5: daytype = "Weekday"; break; case 6, 7: daytype = "Weekend"; break; default: daytype = "Invalid daytype"; System.out.println("day " + day + " is a " + daytype);

Java 13 switch expression i instrukcja yield int day = 2; String daytype = switch (day) { case 1, 2, 3, 4, 5: yield "Weekday"; //yield - jak return w obrębie switch, określa jaka // wartość ma być zwrócona przez wyrażenie switch case 6, 7: ; default: yield "Weekend"; yield "Invalid daytype"; 20

21 int day = 2; switch Java 13 switch expression String daytype = switch (day) { ; case 1, 2, 3, 4, 5 -> "Weekday"; case 6, 7 -> "Weekend"; default -> "Invalid daytype"; System.out.println("day " + day + " is a " + daytype); Switch Expressions wyrażenie switch zostało wpowadzone w JDK 12. W JDK 13 wprowadzono instrukcję yield zwracającą wartość wyrażenia switch, przy czym nie musimy już wtedy korzystać z break. Zatem switch expression (zwracające wartość) powinno korzystać z yield, a switch statement (nie zwracające wartości) powinno używać break.

switch Java 13 switch expression String no="345"; System.out.println(switch (no) { case "1" -> 1; case "2" -> 2; default -> { int len = no.length(); yield len; ); lub System.out.println(switch (no) { case "1": yield 1; case "2": yield 2; default: { int len = no.length(); yield len; ); 22

Klasy i obiekty w Javie Definiowanie klasy jest równoznaczne z tworzeniem wzorca (przepisu) danego obiektu, który umożliwia tworzenie obiektów tej klasy. [atrybutydostepu] class NazwaKlasy [extends NazwaNadklasy] [implements NazwyInterfejsów]{ //ciało klasy tj. //definicje składowych klasy: //pól, konstruktorów, metod, bloków inicjujących Wyróżnia się cztery atrybuty dostępu: public (publiczny) - możliwość dostępu z dowolnej klasy protected (chroniony) - możliwość dostępu z każdej klasy pochodnej lub klas należących do tego samego pakietu private (prywatny) - możliwość dostępu wyłącznie w danej klasie dostęp domyślny (bez podanego specyfikatora dostępu) - możliwość dostępu wyłącznie z klas należących do tego samego pakietu 16.10.2019 23

16.10.2019 24 POLA UWAGA: w pliku źródłowym może występować tylko jedna klasa publiczna i jeśli występuje, to plik musi mieć taką samą nazwę jak ta klasa, z uwzględnieniem wielkości liter. W ciele klasy definiowane są składniki klasy, tj. zmienne (pola) i metody. Pola określają z jakich elementów składają się poszczególne obiekty klasy, zaś metody określają działania, które można na nich wykonywać. DEFINIOWANIE PÓL KLASY [specyfikator_dostępu][static] nazwa_typu nazwa_pola [inicjator]; Przykład public class Para { private int a; private int b; // = 6; //...

METODY 16.10.2019 25 Przy tworzeniu obiektów pola klasy zawsze uzyskują początkowe, domyślne wartości (zerowe) DEFINIOWANIE METOD KLASY [public ]class NazwaKlasy{ //... [specyfikator_dostępu][static] typ_wyniku nazwa_metody(lista parametrów){ //ciało metody tj. //instrukcje wykonywane po wywołaniu metody

METODY 16.10.2019 26 Lista parametrów zawiera rozdzielone przecinkami deklaracje parametrów, które metoda otrzymuje przy wywołaniu. Jeśli metoda zwraca wynik, to w definicji określamy konkretny typ_wyniku i zakończenie jej działania powinno nastąpić na skutek instrukcji return [wyrażenie]; zwracającej dane typu_wyniku, jeśli nie zwraca żadnego wyniku, to jej typ_wyniku określamy słowem kluczowym void (zakończenie metody następuje po dotarciu do ostatniego nawiasu lub instrukcji return;). W Javie argumenty przekazywane są metodom wyłącznie przez wartość, tj. w metodzie odwołujemy się do kopii argumentu. Metody statyczne (static) nie są wywoływane na rzecz obiektów, mogą zatem być wywoływane nawet, gdy nie istnieje żaden obiekt danej klasy.

KONSTRUKTORY Konstruktor służy głównie do inicjowania wartości pól obiektów. Konstruktor ma nazwę jak nazwa klasy i nie ma żadnego typu wyniku. DEFINIOWANIE KONSTRUKTORÓW [public ]class NazwaKlasy{ [specyfikator_dostępu] nazwa_klasy(lista_parametrów){ //czynności wykonywane przez konstruktor Konstruktory zawsze są wywoływane za pomocą wyrażenia new : NazwaKlasy tworzonyobiekt = new NazwaKlasy(parametryKonstruktora) Jeśli w klasie nie zdefiniowano żadnego konstruktora, to do definicji klasy automatycznie dodawany jest konstruktor bezparametrowy (który nie robi nic). 16.10.2019 27

16.10.2019 28 PRZYKŁAD public class Para{ KONSTRUKTORY c.d. private int a, b; //pola klasy public Para(int x, int y){ a=x; b=y;//nadaje polom a i b, wartości //przekazane jako argumenty konstruktora public Para(int x){ a=x; b=x;//nadaje obu polom wartość x Dla tak zdefiniowanej klasy, możemy tworzyć obiekty: Para p1 = new Para(10,7); // para 10 7 Para p2 = new Para(5); //para 5 5 Parap3 = new Para();//BŁĄD-nie ma takiego konstruktora

16.10.2019 29 SKŁADOWE STATYCZNE Składowe (pola i metody) niestatyczne (instancyjne) zawsze wiążą się z istnieniem obiektu danej klasy Składowe statyczne (klasowe) tzn. ze specyfikatorem static nie dotyczą obiektów, ale całej klasy są wspólne dla wszystkich obiektów tej klasy mogą być używane nawet wtedy, gdy nie istnieje żaden obiekt klasy do składowych statycznych odwołujemy się NazwaKlasy.nazwaSkładowej UWAGI: Pola niestatyczne (instancyjne) istnieją w każdym obiekcie klasy, natomiast dla pól statycznych (klasowych) przydzielany jest tylko jeden obszar pamięci na całą klasę Z metod statycznych nie wolno odwoływać się do niestatycznych składowych klasy (gdyż obiekt może nie istnieć) PRZYKŁADY metoda main musi być statyczna ponieważ od niej zaczyna się wykonywanie programu, a w tym momencie nie istnieje jeszcze żaden obiekt.

SKŁADOWE STATYCZNE c.d. W klasie System (dostarczanej jako klasa standardowa) jest stała statyczna out (obiekt klasy PrintStream oznaczający standardowe wyjście) public class System{... public final static PrintStream out;... W klasie PrintStream (jedna z klas standardowych) zdefiniowane są metody println, wypisujące do strumienia wyjściowego -PrintStream podane argumenty public class PrintStream{... public void println(string s){... Zatem System.out to statyczne pole klasy System println to metoda używana na rzecz tego obiektu Stąd: System.out.println(String s) 16.10.2019 30

PRZECIĄŻANIE METOD Przeciążanie metod i konstruktorów polega na definiowaniu metod o tej samej nazwie, ale różniących się liczbą i/lub typami argumentów np. metoda println() ma bardzo wiele wersji z argumentami różnych typów. PRZYKŁAD dla klasy Para o prywatnych polach int a,b void add(para p)//dodaje do pary, na rzecz //której wywołano metodę, parę p void add(int i)//do obu pól pary dodaje podaną liczbę void add(int x, int y)//pierwszy argument dodaje do //1-go skł. Pary, a 2-gi do 2-go UWAGA: Należy specyfikować parametry o radykalnie różnych typach (aby uniknąć pomyłek wynikających z automatycznej konwersji typów) np. dla dwóch metod o tej samej nazwie z parametrami int i short, próba wywołania metody z parametrem char spowoduje wywołanie metody z parametrem int Nie istnieje możliwość deklarowania metod o tej samej nazwie, sygnaturze, ale o rożnym typie wyniku. 16.10.2019 31

PRZECIĄŻANIE KONSTRUKTORÓW Analogicznie możemy przeciążać konstruktory, czyli w jednej klasie możemy mieć konstruktory z różnymi parametrami. Aby nie powtarzać wspólnego kodu w różnych konstruktorach wygodnie jest wywoływać konstruktor w innym konstruktorze. Do takich wywołań używamy słowa kluczowego this(). PRZYKŁAD public class Para{ private int a,b; public Para(){//konstruktor bezparametrowy public Para(int x, int y){a=x; b=y; public Para(int x){ this(x,x); //this(...) musi być 1 instrukcją w ciele konstruktora 16.10.2019 32

OBIEKTY I REFERENCJE 16.10.2019 33 Wszystkie zmienne deklarowane z nazwą klasy w miejscu nazwy typu są zmiennymi typu referencyjnego (zawierają referencje do obiektów lub null). Dla zmiennych typów referencyjnych możemy: Porównywać referencję ( == lub!=) Przypisywać im wartości innych referencji oraz null Operacje wykonywane na zmiennych obiektowych dotyczą referencji, a nie obiektów (operacje arytmetyczne są niedozwolone). Na obiektach (ich wnętrzu) operujemy za pomocą metod zdefiniowanych w klasie obiektu. PRZYKŁAD Para p=new Para(1,2);//tworzony jest obiekt,wywoływany //jest dla niego konstruktor,nadający wartości polom, //new zwraca referencję do obiektu i podstawia pod p Para p1=new Para();//nowy obiekt o wartościach 0,0 p1=p;//kopiujemy referencję, teraz oba obiekty //wskazują na to samo miejsce w pamięci

SŁOWO KLUCZOWE this 16.10.2019 34 Wyrażenie new tworzy obiekt (przydziela pamięć i inicjuje wartości zerami), a następnie dla nowo utworzonego obiektu uruchamiany jest konstruktor. W konstruktorze dostępna jest referencja do tego obiektu w postaci niejawnie zdefiniowanej zmiennej this. this używamy przy przesłonięciu nazw zmiennych oznaczających pola. public class Para{ private int a,b; public Para(){ this(0,0);//this() -pierwsza instrukcja konstruktora //pozwala wywołać w nim inny konstruktor public Para(int a, int b){ this.a = a; this.b = b; //this.a, this.b pola obiektu inicjowanego //przez konstruktor //lub na rzecz którego wywołano metodę

16.10.2019 35 IMPORTOWANIE KLAS Deklaracja importu pozwala na używanie nazw uproszczonych import nazwa_pakietu.*; //importuje wszystkie //nazwy klas z pakietu nazwa_pakietu import nazwa_pakietu.konkretnaklasa; np.: //importuje nazwę klasy import java.io.*; class A{ File f = new File( plik.txt );

16.10.2019 36 DZIEDZICZENIE Dziedziczenie polega na przejęciu właściwości i funkcjonalności obiektów pewnej klasy, z ewentualną ich modyfikacją i/lub uzupełnieniem w taki sposób, by były bardziej wyspecjalizowane. Definicja klasy pochodnej: atrybut_dostępu class B extends A{ Klasa A jest bezpośrednią nadklasą, superklasą, klasą bazową klasy B Klasa B jest bezpośrednią podklasą, klasą pochodną klasy A Aby utworzyć klasę pochodną od klasy z innego pakietu, klasa bazowa musi być zadeklarowana jako public (W innym przypadku nie można się do niej odwołać spoza pakietu). Klasa może dziedziczyć tylko po jednej nadklasie.

DZIEDZICZENIE ZMIENNYCH Podklasa z tego samego pakietu dziedziczy wszystko oprócz zmiennych private. Podklasa, zdefiniowana poza pakietem, w którym jest klasa bazowa, nie dziedziczy zmiennych private i zmiennych z domyślnym atrybutem dostępu. Tabela przedstawia jak atrybuty dostępu wpływają na dziedziczenie zmiennych, gdy podklasa jest zdefiniowana w tym samym pakiecie, co klasa bazowa i gdy podklasa jest zdefiniowana w innym pakiecie. Pakiet 2 Pakiet 1 PodKlasa Klasa PodKlasa Nie int a; Tak int a; public int b; Tak public int b; Tak public int b; protected int c; Tak protected int c; 16.10.2019 37 Tak Nie private int e; Nie protected int c;

Dziedziczenie metod 16.10.2019 38 Zwykłe metody (tzn. wszystkie metody poza konstruktorami) są dziedziczone analogicznie jak zmienne (w zależności od atrybutów). Konstruktory nie są nigdy dziedziczone. Pola klasy bazowej (najczęściej prywatne- nie mamy do nich dostępu w podklasie) inicjujemy w konstruktorze podklasy za pomocą wywołania konstruktora klasy bazowej. Co więcej, jeśli tego nie zrobimy, to kompilator sam wywoła konstruktor bezparametrowy nadklasy. Jawne wywołanie konstruktora klasy bazowej w konstruktorze podklasy(koniecznie jako pierwsza instrukcja) dokonuje się poleceniem super(argl,...,argn);

DZIEDZICZENIE - podsumowanie W Javie każda klasa może bezpośrednio dziedziczyć tylko po jednej klasie, ale pośrednio może mieć wiele nadklas, co wynika z hierarchii dziedziczenia. Ta hierarchia zawsze zaczyna się na klasie Object (której definicja znajduje się w zestawie standardowych klas Javy). Zatem w Javie wszystkie klasy pochodzą pośrednio od klasy Object. Jeśli definiując klasę, nie użyjemy słowa extends (nie zażądamy jawnie dziedziczenia) to i tak nasza klasa domyślnie będzie dziedziczyć klasę Object (tak jakbyśmy napisali class A extends Object). Zatem referencję do obiektu dowolnej klasy można przypisać zmiennej typu Object. Object NadKlasa PodKlasa2 PodKlasa1 PodPodKlasa1 16.10.2019 39

METODY equals() i tostring() Operator == użyty wobec obiektów porównuje referencję Do porównywania zawartości obiektów służy metoda public boolean equals(object o) przedefiniowana w większości standardowych klas (np. String), która zwraca true, gdy obiekt na rzecz którego wywołano metodę ma taką samą zawartość jak obiekt, przekazany jako argument Dla klasy Para sami musimy ją zdefiniować, sygnatura metody musi być zawsze jak powyżej np. public class Para private int a, b; @Override //adnotacja - nieobowiązkowa public boolean equals(object obj){ if (this==obj) return true; if (obj==null) return false; if (getclass()!= obj.getclass())return false; Para other=(para)obj;//konwersja zwężająca if(a!= other.a b!=other.b)return false; else return true; 16.10.2019 40

METODY equals() i tostring() 16.10.2019 41 Do przedstawiania zawartości obiektów w postaci napisów służy metoda : public String tostring() wprowadzona już w klasie Object. W naszych klasach definiujemy ją sami. Jeśli metodzie println() przekażemy jako argument referencję do obiektu, to zostanie wywołana metoda tostring() Przykład public class Para{ private int a,b; //...konstruktory @Override public String tostring(){ return ( +a+, +b+ ) ; public static void main(string[] args){ Para p = new Para(1,2); System.out.println(p);//p.toString()

METODA tostring() - przykład 16.10.2019 42 //definicja klasy bazowej(nadklasy) public class Animal { private String name; //imie zwierzaka public Animal(){//konstruktor bezparametrowy public Animal(String name) { this.name = name; public String getname(){ return name; public void setname(string name){ this.name = name; @Override public String tostring(){ return "Animal: " + name;

METODA tostring() - przykład 16.10.2019 43 // definicja klasy pochodnej public class Cat extends Animal { private String owner;//wlasciciel kotka public Cat(){//konstruktor sam wykona super() public Cat(String name, String owner) { super(name); // wywołaj konstruktor nadklasy this.owner = owner; public String getowner(){ return owner; public void setowner(string owner){ this.owner = owner; @Override public String tostring(){ return super.tostring() + '\n' + "Owner: " + owner; //super.tostring()-wywołanie metody tostring z nadklasy

16.10.2019 44 DZIEDZICZENIE-referencyjna konwersja rozszerzająca Zauważmy, że obiekty klasy Cat są również obiektami klasy Animal (mają jej wszelkie właściwości). Zatem referencje do obiektów klasy Cat możemy przypisać zmiennym oznaczającym obiekty klasy Animal : Cat kitty = new Cat(...); Animal z = kitty; Nazywamy to referencyjną konwersją rozszerzającą (widening reference conversion). Konwersja jest rozszerzająca, bo przekształcamy typ pochodny(referencja do obiektu podklasy) do typu szerszego (referencja do obiektu nadklasy) Zdolność obiektów do stawania się obiektem swojej nadklasy jest użyteczna. PRZYKŁAD: Załóżmy, że mamy nadklasę NadKlasa, z której wyprowadziliśmy podklasy: PodKlasa1, PodKlasa2.

DZIEDZICZENIE konwersja rozszerzająca 16.10.2019 45 Załóżmy, że mamy zdefiniowaną metodę public typ metoda(nadklasa n1, NadKlasa n2){. Wówczas dzięki automatycznej konwersji referencyjnej możemy wywoływać ją dla różnych rodzajów par: NadKlasa nkl1 = new NadKlasa(...); NadKlasa nkl2 = new NadKlasa(...); PodKlasa1 p1 = new PodKlasa1(...); PodKlasa2 p2 = new PodKlasa2(...); typ zm; zm = metoda(nkl1,nkl2); zm = metoda(nkl1,p1); zm = metoda(p1,p2); Gdyby nie było obiektowych konwersji rozszerzających, to dla każdej możliwej kombinacji par musielibyśmy napisać inną wersję metody metoda().

DZIEDZICZENIE-referencyjna konwersja zwężająca Zauważmy, że w rozważanej powyżej metodzie public typ metoda(nadklasa n1, NadKlasa n2){ wobec parametrów n1, n2 możemy używać metod z NadKlasy, ale nie można używać metod z klas pochodnych (nawet, gdy n1, n2 wskazują na obiekty klas pochodnych) Referencyjna konwersja zwężająca polega na jawnym zastosowaniu operatora rzutowania do podklasy np..: void jakasmetoda(nadklasa n){ typ zm=((podklasa1)n).metodapodklasy1(); W przypadku, gdyby ktoś wywołał tę metodę dla obiektu podklasy PodKlasa2, zostałby wyrzucony wyjątek CastClassException i wykonanie programu zostałoby przerwane 16.10.2019 46

OPERATOR instanceof 16.10.2019 47 Wyrażenie ref instanceof T ma wartość true, jeśli referencja ref nie jest null i może być w fazie wykonania programu rzutowana do typu T bez zgłoszenia wyjątku CastClassException tzn. jeśli referencja ref jest typu T lub dowolnego podtypu T. Wówczas możemy napisać: void jakasmetoda (NadKlasa n){ typ zm; if(n instanceof PodKlasa1) zm = ((PodKlasa1)n).metodaPodKlasy1(); else if (n instanceof PodKlasa2) zm = ((PodKlasa2)n).metodaPodKlasy2();

16.10.2019 48 METODA getclass() Innym sposobem stwierdzania typu jest zastosowanie metody getclass(). Metoda ta zwraca faktyczny typ obiektu w postaci referencji do obiektu klasy Class. Obiekty tej klasy oznaczają klasy Cat k = new Cat( Mruczek ); Animal z = k; Class c = z.getclass(); //zmienna c będzie oznaczać klasę Cat Aby dowiedzieć się nazwy klasy -metoda getname() Class c = z.getclass(); String nazwa = c.getname(); Uwaga: Różnica pomiędzy instanceof, a getclass(): jeśli PodKlasa1 miałaby klasę pochodną PodPodKlasa1: PodPodKlasa1 kl = new PodPodKlasa1(...); to kl instanceof PodKlasa1 zwróci true (bo brane są pod uwagę podtypy), natomiast kl.getclass().getname() zwróci napis PodPodKlasa1

DZIEDZICZENIE -nadpisywanie metod w klasie pochodnej Metoda public String tostring(){ return "Animal: " + name; z nadklasy Animal nie jest zbyt przydatna w klasie Cat,bo informuje tylko o cechach dostępnych w nadklasie. Nadpiszmy ją zatem w klasie Cat: @Override public String tostring(){ return super.tostring() + '\n' + "Owner: " + owner; //super.tostring()-wywołanie metody tostring z nadklasy Ta metoda ma tę samą sygnaturę co metoda o tej samej nazwie w klasie bazowej i nadpisuje się nad tamtą metodę. Metoda nadpisująca metodę z klasy bazowej nie może mieć atrybutu dostępu bardziej restrykcyjnego niż metoda z klasy bazowej. 16.10.2019 49