Programowanie obiektowe

Podobne dokumenty
Programowanie obiektowe

Java niezbędnik programisty spotkanie nr 3. Modyfikatory, jednostki kompilacji, tworzenie/inicjalizacja, odśmiecanie/ finalizacja...

Programowanie obiektowe

Dziedziczenie w Javie

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

Dziedziczenie. dr Jarosław Skaruz

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Zaawansowane programowanie w C++ (PCP)

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wykład 6: Dziedziczenie

Wykład 7: Pakiety i Interfejsy

Enkapsulacja, dziedziczenie, polimorfizm

Wykład 4: Klasy i Metody

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

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

Dokumentacja do API Javy.

Programowanie obiektowe

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

Kurs WWW. Paweł Rajba.

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

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

Materiały do zajęć VII

Platformy Programistyczne Wykład z Javy dla zaawansowanych

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Polimorfizm. dr Jarosław Skaruz

Podstawy programowania obiektowego

Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy

Dziedziczenie. Tomasz Borzyszkowski

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

Programowanie obiektowe

1 Atrybuty i metody klasowe

Definicje klas i obiektów. Tomasz Borzyszkowski

Programowanie obiektowe

Język C++ Programowanie obiektowe

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

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

Wykład 8: klasy cz. 4

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

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

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

Programowanie obiektowe

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

10. Programowanie obiektowe w PHP5

Programowanie obiektowe w języku

Programowanie 2. Język C++. Wykład 3.

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

Zaawansowane programowanie w C++ (PCP)

Aplikacje w środowisku Java

KLASY, INTERFEJSY, ITP

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Podstawy programowania III

Programowanie obiektowe - 1.

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

MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Programowanie obiektowe

Programowanie obiektowe

Podstawy Programowania Obiektowego

Programowanie obiektowe i zdarzeniowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie obiektowe

Technologia Programowania 2016/2017 Wykład 4

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

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

Szablony klas, zastosowanie szablonów w programach

Współbieżność w środowisku Java

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Diagramy klas. dr Jarosław Skaruz

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

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

.NET Klasy, obiekty. ciąg dalszy

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

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

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Java: interfejsy i klasy wewnętrzne

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

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

Wzorce projektowe. dr inż. Marcin Pietroo

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

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

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

Klasy abstrakcyjne i interfejsy

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

PHP 5 język obiektowy

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

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

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

Programowanie w Internecie. Java

Programowanie obiektowe

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Dawid Gierszewski Adam Hanasko

Transkrypt:

Przygotował: Jacek Sroka 1 Programowanie obiektowe Wykłady 5 i 6 Inicjalizacja, polimorfizm, dziedziczenie, interfejsy

Przygotował: Jacek Sroka 2 Przypomnienie Typy podstawowe, klasy Pakiety Modyfikatory dostępu Działają dla klas, a nie obiektów Inicjalizacja za pomocą konstruktorów Przeciążanie metod/konstruktorów Kapsułkowanie

Przygotował: Jacek Sroka 3 Zwalnianie zasobów W Javie nie ma żadnych jawnych bądź niejawnych destruktorów Zasoby inne niż pamięć przyjęło się zwalniać w metodzie close() (trzeba ją samemu definiować i wywoływać) plik.close(); gniazdo.close(); PołączenieZBazą.close(); Nie musimy/możemy się martwić o zwalnianie pamięci, w której przechowywane są Javowe obiekty (sterta) i zmienne (stos), bo sami jej nie przydzielamy O obiektach, których już nie będziemy potrzebować można zwyczajnie zapomnieć: { String s = "ala"; System.out.println(s);

Przygotował: Jacek Sroka 4 Odśmiecanie/Finalizacja Zwalnianiem pamięci po obiektach zajmuje się odśmiecacz Tylko obiekty niedostępne z żadnego aktywnego wątku programu Odśmiecaczem steruje JVM Programista może "podpowiedzieć : System.gc() Jeżeli pamięci jest dużo, odśmiecanie może nie być potrzebne Przed odśmieceniem danego obiektu wywoływana jest odziedziczona po Object metoda finalize() O finalize() wiadomo, że będzie wywołana co najwyżej raz, dlatego nie ma sensu zwalniać w niej jakichkolwiek zasobów Można natomiast sprawić, że obiekt stanie się ponownie dostępny Jako ćwiczenie proszę sprawdzić, czy przed odśmieceniem (po raz drugi) przywróconego obiektu finalize() będzie wywołana drugi raz

Przygotował: Jacek Sroka 5 Finalizacja przykład class Finalizacja { int n; String[] smieci; Finalizacja(int n) { this.n = n; smieci = new String[n]; smieci[0] = "Każda literka zaśmieca dwa bajty."; for (int i = 1; i < n; i++) smieci[i] = smieci[i - 1] + smieci[i - 1]; protected void finalize() throws Throwable { super.finalize(); System.out.println("finalize() dla n=" + n);

Przygotował: Jacek Sroka 6 Finalizacja przykład c.d. Wywołanie: for (int i = 1; i <= 13; i++) { Finalizacja f = new Finalizacja(i); Może dać następujący wynik: finalize() dla n=9 finalize() dla n=10 finalize() dla n=12

Przygotował: Jacek Sroka 7 Jak działa odśmiecacz Odnajdywanie niedostępnych obiektów: zliczanie referencji odwołujących się do obiektu (znajdywanie grup obiektów odwołujących się do siebie nawzajem jest kosztowne) przeglądanie sieci dostępnych (przez stos) obiektów i jakoś ich oznaczanie Porządkowanie sterty: stop-and-copy - odśmiecamy i porządkujemy (przesuwamy obiekty dbając o naprawianie referencji); strategia dobra jak dużo odśmiecania mark-and-sweep jedynie odśmiecamy; strategia dobra jak mało odśmiecania stop-and-copy można udoskonalić dzieląc stertę na bloki i umieszczając w każdym licznik jego wykorzystania Maszyna wirtualna może przełączać strategie w zależności od własności działającego programu

Przygotował: Jacek Sroka 8 Kolejność inicjalizacji class Pom1 { Pom1() {System.out.println("Pom1()"); class TestInicjalizacji { int x = 777; Pom1 p = new Pom1(); int y = f(); int f() { System.out.println("f()"); return 1; //deklaracje metod mogą się przeplatać z deklaracjami atrybutów int yy; TestInicjalizacji() { System.out.println("TestInicjalizacji()");... Kolejność: Pom1(), f(), TestInicjalizacji()

Przygotował: Jacek Sroka 9 Kolejność inicjalizacji c.d.... //kolejność deklaracji zmiennych ma znaczenie przy inicjalizacji int v = x; //int a = b; int b; //kolejność jest też istotna przy przekazywaniu parametrów //int a = b(u); int b(int u) { return u; int u; //można jednak oszukiwać (wynik: h(); v=0) int z = h(); int h() { System.out.println("h(); v="+v); return v; int v = 1313;...

Przygotował: Jacek Sroka 10 Inicjalizacja statyczna Inicjalizacja składowych statycznych odbywa się jeden raz, w momencie pierwszego użycia klasy (odwołanie do składowej statycznej lub utworzenie obiektu) class InicjalizacjaStatyczna { static Pom1 p = new Pom1(); static void test() {System.out.println("test()"); InicjalizacjaStatyczna.test(); InicjalizacjaStatyczna is = new InicjalizacjaStatyczna(); Class c = InicjalizacjaStatyczna.class;

Przygotował: Jacek Sroka 11 Grupowanie inicjalizacji class BlokInicjalizacji { int x; //o wyjątkach jeszcze opowiemy { try { System.out.println("ustawiam x"); x = 7; catch (Exception e) { System.out.println("Wpadłeś jak śliwka w studzienkę kanalizacyjną"); static int y; static { int pom; pom = 1; System.out.println("ustawiam y"); y = pom; Kolejność znowu od góry na dół.

Przygotował: Jacek Sroka 12 Wielokrotne użycie kodu Agregacja całkowita (ang. composition) związek całość część Czas życia część ograniczony przez czas życia całości Część należy tylko do jednej całości Klasa tworzy i używa obiekty innych klas Okienko Ramka Uogólnienie (ang. generalization) związek między nadklasą i podklasą Podklasa jest szczególnym przypadkiem nadklasy Podklasy można używać wszędzie tam gdzie nadklasy Okienko Dialog Nie zależy od implementacji klas (to że w tej chwili są podobnie zaimplementowane nie ma znaczenia) Dziedziczenie i przedefiniowywanie metod Przykłady: Owoc-Gruszka, Ptak-Wrona, Figura-Kwadrat

Przygotował: Jacek Sroka 13 Przykład składanie kawałków tortu class A { int ia = 1; void infoa() { System.out.println("A.infoA() na obiekcie klasy " + this.getclass().getsimplename() + "\n ia="+ia); class B extends A { int ib = 2; void infob() { infoa(); System.out.println("B.infoB() na obiekcie klasy " + this.getclass().getsimplename() + "\n ia="+ia+", ib="+ib); class C extends B { int ic = 3; void infoc() { InfoA(); infob(); System.out.println("C.infoC() na obiekcie klasy "...

Przygotował: Jacek Sroka 14 Wynik B składa się ze swoich składowych plus składowe A C składa się ze swoich składowych plus składowe B, czyli również składowe A C c = new C(); c.infoc(); // A.infoA() na obiekcie klasy C // IA=1 // // A.infoA() na obiekcie klasy C // ia=1 // B.infoB() na obiekcie klasy C // ia=1, ib=2 // // C.infoC() na obiekcie klasy C // ia=1, ib=2, ic=3 A a = c; System.out.println("a.iA=" + a.ia + ", c.ia=" + c.ia); //a.ia=1, c.ia=1 A co jak zmienimy nazwy atrybutów w hierarchii na takie same? W praktyce tego unikamy lub chronimy dostęp do atrybutów przy pomocy modyfikatorów dostępu

Przygotował: Jacek Sroka 15 Dostęp do atrybutów class A { int i = 1; void infoa() { System.out.println("A.infoA() na obi...\n ia=" + i); class B extends A { int i = 2; void infob() { infoa(); System.out.println("B.infoB()...\n ia=" + ((A) this).i + ", ib="+i); //albo super.i class C extends B { int i = 3; void infoc() { infoa(); infob(); System.out.println("C.infoC()...");//nie można super.super.i

Przygotował: Jacek Sroka 16 Wynik C c = new C(); c.infoc(); // A.infoA() na obiekcie C // ia=1 // // A.infoA() na obiekcie C // ia=1 // B.infoB() na obiekcie C // ia=1, ib=2 //... // C.infoC() na obiekcie C // ia=1, ib=2, ic=3 A a = c; System.out.println("a.i=" + a.i + ", c.i=" + c.i); // a.i=1, c.i=3 Nadal podklasa ma wszystkie kawałki Rzutowanie może być niebezpieczne (wyjątek vs błąd kompilacji) chociaż akurat nie tutaj super to tak jak this referencja do bieżącego obiektu tylko że przestają być widoczne deklaracje wprowadzone przez podklasę (tylko jeden poziom wyżej) Przy odwoływaniu się do atrybutów istotny jest typ statyczny!

Przygotował: Jacek Sroka 17 Dostęp do metod class A { int i = 1; void info() { System.out.println("A.info() z ia=" + i); class B extends A { int i = 2; void info() { super.info(); System.out.println("B.info() z ia=" + ((A) this).i + ", ib=" + i); class C extends B { int i = 3; void info() { super.info();//jak wywołać info() z A? System.out.println("C.info() z ia=" + ((A) this).i +...);

Przygotował: Jacek Sroka 18 Wynik (polimorfizm) C c = new C(); c.info(); //A.info() z ia=1 //B.info() z ia=1, ib=2 //C.info() z ia=1, ib=2, ic=3 A a = c; a.info(); //A.info() z ia=1 //B.info() z ia=1, ib=2 //C.info() z ia=1, ib=2, ic=3 Przy odwoływaniu się do metod istotny jest typ dynamiczny!

Przygotował: Jacek Sroka 19 Wzorce projektowe Pewne wypróbowane i poprawne rozwiązania problemów projektowych mogą być (i były) wyrażane jako dobre praktyki, heurystyki lub wzorce nazwane przepisy zadanie-rozwiązanie. (na podstawie "Applying UML And Patterns" Craiga Larmana). Sam termin wzorzec ma sugerować coś powtarzalnego. To nie są nowe pomysły! Dwa istotne zbiory wzorców to wzorce GoF i GRASP. GRASP to metodyczne podejście do uczenia się podstaw projektowania obiektowego. GRASP: Wysoka spójność, Luźne sprzężenie, Polimorfizm, Rzeczoznawca, Twórca, Zarządca, Pośrednictwo, Czysty wymysł, Kapsułkowanie zmienności GoF (23 ogólnie uznane wzorce): Fabryka, Singleton, Adapter, Strategia, Kompozyt, Fasada, Obserwator (Delegowanie, Wydawca-Prenumerator)

Przygotował: Jacek Sroka 20 Adapter Kontekst/Problem: Jak poradzić sobie z niekompatybilnymi interfejsami lub dostarczyć stabilny interfejs dla podobnych komponentów posiadających różniące się interfejsy? Rozwiązanie: Używając pośredniego obiektu adaptera przekształć oryginalny interfejs komponentu na inny. Dodajemy poziom pośredni składający się z obiektów, które przystosowują różnorodne zewnętrzne interfejsy do spójnego interfejsu używanego w aplikacji! Konwencja nazewnicza: nazwę wzorca wbudowujemy w nazwę typu Adaptery są Fasadami (opakowują dostęp do podsystemu lub systemu w pojedynczym obiekcie).

Przygotował: Jacek Sroka 21 Fabryka Kto powinien tworzyć obiekty, np. obiekty (adaptery) reprezentujące zewnętrzne usługi (mogące mieć różne interfejsy, np. AdapterKartyVisa). Chcemy utrzymać rozdzielenie zagadnień obiekty dziedzinowe odpowiadają jedynie za logikę aplikacji (chcemy zachować wysoką spójność). (Nie zawsze jest to możliwe programowanie aspektowe). public NaszaFabryka {... public AdapterKarty getadapterkarty() { //odczytaj z pliku konfiguracyjnego jakiego adaptera użyć //utwórz odpowiedni i zwróć go

Przygotował: Jacek Sroka 22 Singleton Jak uzyskać dostęp do fabryki z poprzedniego przykładu? Kto ją tworzy? Zazwyczaj potrzeba tylko jednej fabryki? Możemy przekazywać fabrykę jako parametr, ale możemy użyć wzorca Singleton egzamplarz jest atrybutem statycznym, a konstruktor fabryki jest prywatny public static synchronized NaszaFabryka getegzemplarz() { // sekcja krytyczna, jeżeli aplikacja jest wielowątkowa if ( egzemplarz == null ) { egzemplarz = new FabrykaUsług(); return egzemplarz; //czyli fabryka staje się dostępna globalnie!

Przygotował: Jacek Sroka 23 Ćwiczenie class A { void starametoda() { System.out.println("A.staraMetoda()"); void pisz() { System.out.println("A.pisz()"); class B extends A { void pisz() { System.out.println("B.pisz()"); void nowametoda() { System.out.println("B.nowaMetoda()"); pisz(); super.pisz(); Jaki będzie wynik lub czy się nieskompiluje? B b = new B(); b.starametoda(); //A.staraMetoda() b.pisz(); //B.pisz() b.nowametoda(); //B.nowaMetoda() //B.pisz() //A.pisz() A a = new B(); a.pisz(); //B.pisz() a.starametoda(); //A.staraMetoda()

Przygotował: Jacek Sroka 24 Ćwiczenie class A { void pisz() { System.out.println("A.pisz()"); void jakiewiązanie() { pisz(); B b = new B(); b.jakiewiązanie(); //B.pisz() A a = new B(); a.jakiewiązanie(); //B.pisz() class B extends A { void pisz() { System.out.println("B.pisz()");

Przygotował: Jacek Sroka 25 Ćwiczenie class A { int x = 1; B b = new B(); A a = new B(); void testzmiennej() { System.out.println(x); b.testzmiennej(); //2 //1 //1 class B extends A { int x = 2; int y = 2; void testzmiennej() { System.out.println(x); System.out.println(super.x); super.testzmiennej(); a.testzmiennej(); //2 //1 //1

Przygotował: Jacek Sroka 26 Wielodziedziczenie Co ze składowymi odziedziczonymi z wielu nadklas? W Javie tylko jedna nadklasa W zamian za to interfejsy Zawierają jedynie sygnatury metod, bez implementacji Wszystkie składowe są publiczne (czy to wskażemy czy nie) Wszystkie atrybuty są dodatkowo statyczne i final ( Nie ma problemu jak w klasie jest atrybut o tej samej nazwie Wygodniej się do nich odwoływać przez nazwę klasy, a nie referencję do obiektu trzeba je zainicjować w miejscu deklaracji Nie mogą zawierać bloków inicjalizacji class Pracownik extends Osoba // dziedziczenie po klasie class Samochód implements Pojazd, Towar // dziedziczenie po kilku interfesjach class Chomik extends Ssak implements Puchate, DoGłaskania // dziedziczenie po klasie i kilku interfejsach

Przygotował: Jacek Sroka 27 Przykład interfejsy interface IntA { public void metodaa(); public void metodac(); interface IntB { public void metodab(); public void metodac(); class NadKl { public void metodac() {... class PodKl extends NadKl implements IntA, IntB { public void metodaa() {... public void metodab() {... //metodac() jest w nadklasie

Przygotował: Jacek Sroka 28 Uogólnianie interfejsów Tu wielodziedziczenie jest pełne! interface IntA {... interface IntB {... interface IntC extends IntA, IntB { public void metodad(); class KlC implements IntC { public void metodaa() { public void metodab() { public void metodac() { public void metodad() { KlC cc = new KlC(); IntC ic = cc; IntA ia = cc; IntB ib = ic;

Przygotował: Jacek Sroka 29 Wielodziedziczenie a przeciążanie Nie zawsze jest możliwe zdecydowanie, którą z przeciążony metod wybrać void przeciążona(inta a) { void przeciążona(intb b) { PodKl p = new PodKl(); //implementowała IntA i IntB przeciążona(p); //błąd Natomiast przy uogólnianiu wybierana jest klasa najbardziej szczegółowa class NadA { class NadB extends NadA { class NadC extends NadB { static void przeciążona(nada a) {System.out.println("a"); static void przeciążona(nadb b) {System.out.println("b"); NadC c = new NadC(); przeciążona(c); //wypisze się b

Przygotował: Jacek Sroka 30 Zagadka Wymyśl dwa interfejsy, które nie mogą być naraz zaimplementowane przez jedną klasę

Przygotował: Jacek Sroka 31 Odpowiedź interface WykluczającyA { public void metoda(); interface WykluczającyB { public int metoda(); //Tak się nie da! class Wykluczanie implements WykluczającyA, WykluczającyB { public void metoda() { public int metoda() {return 0;

Przygotował: Jacek Sroka 32 Klasy abstrakcyjne Klasy z niekompletną implementacją Nie można tworzyć ich egzemplarzy Przydają się jak chcemy wprowadzić wspólny kod do hierarchii abstract class SłużbySpecjalne { void podsłuchuj() { //... String generujprzeciek(); class CentralneBiuroDoWalkiZUkładami extends SłużbySpecjalne { String generujprzeciek() { //...

Przygotował: Jacek Sroka 33 Kolejność inicjalizacji Statyczne składowe nadklasy Statyczne składowe podklasy (Pełna inicjalizacja nadklasy) Zwykłe składowe nadklasy Konstruktor nadklasy (określony w pierwszej instrukcji konstruktora podklasy) Uwaga nad dynamiczne wiązanie (Pełna inicjalizacja podklasy) Zwykłe składowe podklasy Konstruktor podklasy (trzeba zacząć od wywołania konstruktora nadklasy, domyślne konstruktory może wywołać kompilator)

Przygotował: Jacek Sroka 34 Przykład klasa pomocnicza class Echo { static int getvalue(string s) { System.out.println("getValue(" + s + ")"); return 1;

Przygotował: Jacek Sroka 35 Przykład c.d. class A { int x = Echo.getValue("A.x"); void pisz() { System.out.println("A.pisz()"); A() { System.out.println("A()"); pisz(); class B extends A { int x = Echo.getValue("B.x"); int y = Echo.getValue("B.y"); B b = new B(); //getvalue(a.x) //A() //B.pisz() //getvalue(b.x) //getvalue(b.y) //B() //B.pisz() void pisz() { System.out.println("B.pisz()"); B() { super(); System.out.println("B()"); pisz();

Przygotował: Jacek Sroka 36 Przykład interfejsy interface MójInterfejs { int X = Log.dajInt(); public static final int Y = 2; int Z = Log.dajInt();//nieużywana stała //też zostanie //zainicjalizowana void róbxxx(); public void róbyyy(); class MojaKlasa implements MójInterfejs { public void róbxxx() { System.out.println("róbXXX("+X+")"); public void róbyyy() { System.out.println("róbYYY("+Y+")"); MojaKlasa mk; MójInterfejs mi; mk = new MojaKlasa(); mi = mk; mi.róbyyy(); System.out.println("leniwośc"); mk.róbxxx(); //róbyyy(2) //leniwość //Log.dajInt() //Log.dajInt() //róbxxx(1) //prawdopodobnie 2 została //zinlinowana

Przygotował: Jacek Sroka 37 final Atrybuty Stałe kompilacji będą wplatane w wyrażenia Wartość typu podstawowego lub referencji nie może ulec zmianie Można użyć z argumentami metod Metody Nie mogą być przesłaniane Nie ma dynamicznego wiązania, czasami kompilator może wstawiać kod metody w miejsce jej wywołania (ang. inline) Klasy nie można rozszerzać

Przygotował: Jacek Sroka 38 Atrybuty final trzeba zainicjalizować class TestFinal { final int x; TestFinal() { x = 1; //inicjalizacja musi nastąpić //najpóźniej w konstruktorze

Przygotował: Jacek Sroka 39 final a private Metody private i tak nie można przesłonić, ale można zdefiniować metodę o takiej samej sygnaturze class Zagadka { // final tu nic nie zmieni private void pisz() { System.out.println("Zagadka.pisz()"); Zagadka() { pisz(); class PseudoPrzesloniecie extends Zagadka { private void pisz() { System.out.println("PseudoPrzesloniecie.pisz()"); PseudoPrzesloniecie() { pisz(); PseudoPrzesloniecie p = new PseudoPrzesloniecie(); //Zagadka.pisz() //PseudoPrzesloniecie.pisz()