Programowanie w Javie - wykład 3

Podobne dokumenty
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

Aplikacje w środowisku Java - wykład 1

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Dziedziczenie. dr Jarosław Skaruz

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

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

Rozdział 4 KLASY, OBIEKTY, METODY

Wykład 7: Pakiety i Interfejsy

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

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

Dokumentacja do API Javy.

Platformy Programistyczne Podstawy języka Java

Podstawy Języka Java

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Wykład 4: Klasy i Metody

Programowanie w Internecie. Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

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

Definiowanie własnych klas

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe

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

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

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

Java Język programowania

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

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

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Klasy abstrakcyjne, interfejsy i polimorfizm

Kompozycja i dziedziczenie klas

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

Kurs WWW. Paweł Rajba.

Wykład 6: Dziedziczenie

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

Programowanie obiektowe

Wykład 8: klasy cz. 4

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

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

Enkapsulacja, dziedziczenie, polimorfizm

Polimorfizm. dr Jarosław Skaruz

Technologie i usługi internetowe cz. 2

TEMAT : KLASY DZIEDZICZENIE

Aplikacje w środowisku Java

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

Programowanie obiektowe

1 Atrybuty i metody klasowe

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

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Programowanie obiektowe

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

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

Programowanie obiektowe

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

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

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

Dziedziczenie jednobazowe, poliformizm

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

Programowanie obiektowe

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

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

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

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

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

Klasy cd. Struktury Interfejsy Wyjątki

Materiały do zajęć VII

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

Aplikacje w środowisku Java

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

Aplikacje w Javie wykład 5 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Interfejsy

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

Kompozycja i dziedziczenie klas

Programowanie obiektowe

Podstawy programowania obiektowego

Wykład 2: Podstawy Języka

PHP 5 język obiektowy

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

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe

Język C++ Programowanie obiektowe

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

.NET Klasy, obiekty. ciąg dalszy

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

Klasy i obiekty cz II

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie obiektowe

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Lab 9 Podstawy Programowania

Programowanie obiektowe i zdarzeniowe

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

Transkrypt:

Pakiety import Klasy dziedziczenie Programowanie w Javie - wykład 3 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

OBIEKTY I REFERENCJE 06.03.2019 2 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 p1.show(); //(1,2)

SŁOWO KLUCZOWE this 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ę 06.03.2019 3

SŁOWO KLUCZOWE this Ponieważ obiekt na rzecz którego wywołano metodę, jest wewnątrz metody reprezentowany przez this, dlatego kolejnym przypadkiem jego użycia są metody zwracające referencję do obiektu na rzecz którego zostały wywołane, np. metoda dodająca parę przekazaną jako argument do pary, na rzecz której wywołano metodę i zwracająca otrzymany wynik: Para add(para p){ a += p.a; b += p.b; return this; Przykładowe wykorzystanie powyższej metody (kaskadowe): Para suma = new Para(0,0); Para p1 = new Para(1,2); Para p2 = new Para(3,4); suma.add(p1).add(p2); this(...) używane jako pierwsza instrukcja konstruktora pozwala wywołać w nim inny konstruktor 06.03.2019 4

ZASIĘG ZMIENNYCH 06.03.2019 5 W każdej metodzie/konstruktorze klasy możemy odwołać się do identyfikatorów składowych klasy(pól i metod) niezależnie od tego w którym miejscu klasy są zadeklarowane. Zmienne zadeklarowane w metodzie/konstruktorze czyli tzw. zmienne lokalne mają zasięg lokalny- od miejsca deklaracji do końca metody, dotyczy to również parametrów deklarowanych w nagłówku metody. Próba odczytu niezainicjowanych zmiennych lokalnych powoduje błąd kompilacji. Zmienne deklarowane wewnątrz bloków lokalnych (zestaw instrukcji ujęty w {) mają zasięg od miejsca deklaracji do końca bloku. Wartości zmiennych lokalnych są tracone po wyjściu sterowania z bloku (automatyczne zwolnienie pamięci). Java sama dba o to, aby usunąć obiekt, gdy nie istnieje już żaden wskaźnik do niego (referencja). Zajmuje się tym tak zwany garbage collector. Jeżeli w klasie zostanie zadeklarowana metoda finalize(), to będzie ona wywoływana przed zwolnieniem pamięci przydzielonej obiektowi tej klasy.

PAKIETY 06.03.2019 6 Pakiety (ang.packages) są zbiorami klas służącymi ich logicznej organizacji. Pakiet grupuje klasy o wspólnej funkcjonalności. Standardowa biblioteka Javy składa się z wielu pakietów, do których należą java.lang, java.util, java.net. Mają one strukturę hierarchiczną. Pakiety mogą zawierać klasy, a także inne pakiety, podobnie jak w przypadku katalogów i podkatalogów. Wszystkie standardowe pakiety Javy znajdują się w pakietach java i javax. Pakiety chronią nas przed kolizjami nazw. Może istnieć wiele klas o takich samych nazwach w różnych pakietach np. File, dlatego używamy nazw kwalifikowanych: nazwa_pakietu.nazwa_klasy np. java.io.file f= new java.io.file( plik.txt ); Każda klasa należy do jakiegoś pakietu. Dla klas definiowanych w naszych przykładach używany był pakiet domyślny (zwykle bieżący katalog).

06.03.2019 7 PAKIETY c.d. Aby zachować unikalność nazw pakietów zaleca się stosowanie w tych nazwach odwróconych domen internetowych(które są unikatowe) Klasy są przechowywane w podkatalogach systemu plików. Ścieżka do klasy musi odpowiadać nazwie jej pakietu. Nazwy pakietów zwyczajowo pisze się małymi literami. Kolejne poziomy zagnieżdżenia w hierarchii pakietów oddziela się od siebie kropkami, podobnie do tego jak nazwy kolejnych katalogów w ścieżce dostępu oddziela się od siebie ukośnikami. Jeśli zatem deklarujemy, że klasa należy do pewnego pakietu, to plik zawierający implementację tej klasy musi znajdować się w katalogu odpowiadającym temu pakietowi. Przykładowo, jeśli plik zawierający definicję klasy HelloWorld znajduje się w katalogu pl/naukajavy, to klasa ta należy do pakietu pl.naukajavy.

PAKIETY c.d. Pakiety klas są zwykle przechowywane w plikach JAR (Java ARchive) lub ZIP. Pliki Jar zawierają skompresowane pliki klas i katalogi. Klasy zdefiniowane w nienazwanym pakiecie (tj. bez użycia dyrektywy package) mają nazwy proste np. Para. Przy tworzeniu większych projektów lub klas, używanych w innych programach, klasy umieszczamy w nazwanych pakietach, stosując dyrektywę package. (W IntelliJ,NetBeans wystarczy podać nazwę pakietu w dialogu definiowania klasy, a automatycznie wygenerowany plik źródłowy będzie zawierał odpowiednią dyrektywę package) np. : package pl.naukajavy; public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World!"); 06.03.2019 8

06.03.2019 9 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 );

IMPORTOWANIE KLAS Klasy String i System pochodzą z pakietu java.lang. Nie wymaga on importu, nazwy klas z tego pakietu są importowane domyślnie. Importowanie nazw klas nie oznacza wstawiania ich definicji do programu, umożliwia on tylko posługiwanie się nazwami skróconymi Import statyczny umożliwia odwołania do składowych statycznych import static nazwa_pakietu.*; import static nazwa_pakietu.konkretnaklasa; np.: import static java.lang.system.out; public class MojaKlasa{ public static void main(string[] args){ out.println( krócej ); 06.03.2019 10

STRUKTURA PROGRAMU 06.03.2019 11 Program w Javie to zestaw definicji klas Poza ciałem klasy nie może być żadnego kodu, poza dyrektywami package, importu i komentarzami package //nieobowiązkowa deklaracja pakietu import //deklaracje importu public class A{ class B{ Program może być zapisany w 1 lub wielu plikach (.java) (W pliku może być tylko 1 klasa publiczna)

06.03.2019 12 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; 06.03.2019 13 Tak Nie private int e; Nie protected int c;

Dziedziczenie metod 06.03.2019 14 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);

06.03.2019 15 Dziedziczenie - przykład PRZYKŁAD //definicja klasy bazowej(nadklasy) public class Zwierze { private String gatunek; public Zwierze(){//konstruktor bezparametrowy public Zwierze(String nazwa) { gatunek = nazwa; public void cotojest() { System.out.println("To jest " + gatunek);

Dziedziczenie przykład c.d. // definicja klasy pochodnej public class Pies extends Zwierze { private String imie;// imię psa private String rasa;// rasa public Pies(){//konstruktor sam wykona super() public Pies(String toimie) { super("pies"); // wywołaj konstruktor nadklasy imie = toimie; // podane imię rasa = "Nieznana"; // domyślna rasa public Pies(String toimie, String tarasa) { super("pies"); // wywołaj konstruktor nadklasy imie = tolmie; // podane imię rasa = tarasa; // podana rasa 06.03.2019 16

Dziedziczenie przykład c.d. 06.03.2019 17 public class Test { public static void main(string[] args) { Pies nowypies = new Pies("Fido","Chihuahua"); Pies gwiazdorpies = new Pies("Lassie"); nowypies.cotojest(); // opis -met.nadklasy gwiazdorpies.cotojest(); // i opis gwiazdora Klasa Pies dziedziczy po klasie Zwierze, więc obiekty klasy Pies mają również właściwości obiektów klasy Zwierze, a zatem możemy na ich rzecz używać metod zdefiniowanych w klasie Zwierze

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 06.03.2019 18

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; 06.03.2019 19

METODY equals() i tostring() 06.03.2019 20 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);//toString(p)

METODA tostring() - przykład 06.03.2019 21 //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 06.03.2019 22 // 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(imie); // 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

06.03.2019 23 DZIEDZICZENIE-referencyjna konwersja rozszerzająca Zauważmy, że obiekty klasy Pies są również obiektami klasy Zwierze (mają jej wszelkie właściwości). Zatem referencje do obiektów klasy Pies możemy przypisać zmiennym oznaczającym obiekty klasy Zwierze : Pies p = new Pies(...); Zwierze z = p; 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 06.03.2019 24 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 06.03.2019 25

OPERATOR instanceof 06.03.2019 26 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();

06.03.2019 27 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 Pies p = new Pies( Burek ); Zwierze z = p; Class c = z.getclass(); //zmienna c będzie oznaczać klasę Pies 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 cotojest() z nadklasy Zwierze public void cotojest(){ System.out.println("To jest " + gatunek); nie jest zbyt przydatna w klasie Pies,bo informuje tylko o cechach dostępnych w klasie Zwierze. Dopiszmy zatem w klasie Pies: public void cotojest(){ super.cotojest();//wywołanie metody bazowej //dowiemy się,że to pies, bo pole gatunek prywatne System.out.println("To jest " + imie + " z rasy " + rasa) 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. 06.03.2019 28