Platformy Programistyczne Wykład z Javy dla zaawansowanych

Podobne dokumenty
Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

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

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

Programowanie obiektowe

Dziedziczenie. dr Jarosław Skaruz

Wykład 7: Pakiety i Interfejsy

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Programowanie obiektowe

Wykład 8: Obsługa Wyjątków

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

Dokumentacja do API Javy.

Programowanie obiektowe

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

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

Programowanie Obiektowe Ćwiczenie 4

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

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

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Klasy abstrakcyjne, interfejsy i polimorfizm

Enkapsulacja, dziedziczenie, polimorfizm

Dziedziczenie. Tomasz Borzyszkowski

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

Kurs WWW. Paweł Rajba.

Polimorfizm. dr Jarosław Skaruz

Interfejsy i klasy wewnętrzne

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

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

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

Java: interfejsy i klasy wewnętrzne

Programowanie obiektowe

Java Język programowania

Programowanie obiektowe i zdarzeniowe

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Aplikacje w środowisku Java

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

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

Wykład 04. Programowanie obiektowe. Maciej Wołoszyn 17 marca Spis treści

Klasy abstrakcyjne i interfejsy

Platformy Programistyczne Podstawy języka Java

Aplikacje w środowisku Java

Wykład 2: Podstawy Języka

TEMAT : KLASY DZIEDZICZENIE

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

Podstawy Języka 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);

Pakiety i interfejsy. Tomasz Borzyszkowski

Wykład 4: Klasy i Metody

Wykład 6: Dziedziczenie

Programowanie w Internecie. Java

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

Wykład 5 Okna MDI i SDI, dziedziczenie

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

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

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

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

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

Programowanie obiektowe

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

Programowanie obiektowe

Multimedia JAVA. Historia

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

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

Zaawansowane programowanie w C++ (PCP)

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

Programowanie w Javie wykład 8 Interfejsy

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

KLASY, INTERFEJSY, ITP

Programowanie obiektowe w języku

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

Przykład -

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Wyjątki (exceptions)

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

Programowanie obiektowe

Template method (metoda szablonowa)

Systemy Rozproszone - Ćwiczenie 6

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

PHP 5 język obiektowy

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

Klasy cd. Struktury Interfejsy Wyjątki

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

Programowanie obiektowe. Wykład 03. Maciej Wołoszyn 17 marca Polimorfizm oraz wczesne i późne wiazanie

Podstawy programowania obiektowego

Programowanie obiektowe

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

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

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

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

Transkrypt:

Platformy Programistyczne Wykład z Javy dla zaawansowanych Agata Migalska 20 maja 2014

Plan wykładu 1 Polimorfizm i dziedziczenie 2 Życie i śmierć obiektu 3 Poziomy oraz modyfikatory dostępu 4 Obsługa wyjątków

Polimorfizm i dziedziczenie 1 Polimorfizm i dziedziczenie Tetris w klasycznej odsłonie Tetris - nowe wymagania 2 Życie i śmierć obiektu 3 Poziomy oraz modyfikatory dostępu 4 Obsługa wyjątków

Tetris

Klocki potrafią się narysować

Klocki obracają się

Klocki przesuwają się w dół i na boki

Klocki znają swoją pozycję

Klocki - ich zmienne i metody

Wspólna abstrakcja

Wspólna abstrakcja

Relacje JEST i MA Gdy jedna klasa dziedziczy po drugiej mówimy, że klasa pochodna rozszerza klasę bazową Test relacji JEST Test sprawdzający czy jedna rzecz powinna rozszerzać inną Kwadratowy klocek JEST klockiem Człowiek JEST ssakiem Pozycja klocka JEST klockiem Wanna JEST łazienką

Relacje JEST i MA Relacja MA Klocek MA swoją pozycję Łazienka MA wannę Dziedziczenie a kompozycja Jeżeli A JEST B, korzystamy z dziedziczenia Jeżeli A MA B, korzystamy z kompozycji

Jak to zaimplementować? public abstract class Klocek { private Wspolrzedne pozycja; public abstract void narysuj(); public void obroc(){ public void przesunwbok (){ public void przesunwdol (){

Jak to zaimplementować? public class Kwadrat extends Klocek { public void narysuj() { Klasa konkretna Konkretna klasa pochodna musi zaimplementować wszystkie metody abstrakcyjne, które nie zostały zaimplementowane w jej abstrakcyjnej klasie bazowej

Drzewo dziedziczenia public abstract class Foo { public abstract String moo(); public abstract void boo(); public abstract class FooMoo extends Foo { public String moo() { return " moo"; public class FooMooBoo extends FooMoo { public void boo(){

Jeszcze o dziedziczeniu Jeśli zadeklarujesz metodę jako abstrakcyjną, w ten sam sposób MUSISZ zadeklarować całą klasę Abstrakcyjne metody nie mogą istnieć w nieabstrakcyjnych klasach Klasa zadeklarowana jako abstrakcyjna NIE MUSI mieć ani jednej metody abstrakcyjnej

Dygresja na temat nazewnictwa Nazwy klas rozpoczynamy z wielkiej litery Nazwa pliku *java jest taka sama jak nazwa klasy w tym pliku Nazwy zmiennych i metod rozpoczynamy z małej litery W nazwach wykorzystujemy tzw camel case, czyli kolejnewyrazyrozpoczamyzwielkiejlitery

Tetris - nowe wymagania

Czy bomba jest klockiem?

O czym bomba wie i co potrafi zna swoją pozycję potrafi się narysować przesuwa się w dół i na boki cecha bomby występująca u klocka cecha bomby nie występująca u klocka

O czym bomba wie i co potrafi zna swoją pozycję potrafi się narysować przesuwa się w dół i na boki nie obraca się wybucha cecha bomby występująca u klocka cecha bomby nie występująca u klocka

O czym bomba wie i co potrafi zna swoją pozycję potrafi się narysować przesuwa się w dół i na boki nie obraca się brak obrotu to specyficzny sposób obrotu wybucha klocki nie wybuchają cecha bomby występująca u klocka cecha bomby nie występująca u klocka

Gdyby w Javie istniało wielodziedziczenie

Gdyby w Javie istniało wielodziedziczenie

Interfejs

Implementacja Bomby public interface MaterialWybuchowy { public abstract void zdetonujsie(); public class Bomba extends Klocek implements MaterialWybuchowy { public void zdetonuj() { // efektowny wybuch public void obroc() { // nie rob absolutnie nic

Gdy jeden interfejs to za mało public class Bomba extends Klocek implements MaterialWybuchowy, Atomowa, Samonaprowadzalna {

Dylemat: co wybrać? Utwórz klasę, która nie rozszerza żadnej innej, jeżeli nie przechodzi ona testu relacji JEST z żadną inną klasą Utwórz klasę pochodną jedynie wtedy, gdy potrzebujesz bardziej wyspecjalizowanej wersji klasy i musisz przesłonić jakieś zachowania lub dodać nowe Użyj klasy abstrakcyjnej, jeśli chcesz zdefiniować pewien wzorzec dla klas pochodnych i jeśli chcesz mieć pewność, że nikt nie będzie mógł tworzyć obiektów tego typu Utwórz interfejs, jeśli chcesz zdefiniować funkcję, jaką mają pełnić inne klasy i to niezależnie od ich położenia w drzewie dziedziczenia

Operator instanceof Operatof instanceof Przeprowadza test relacji JEST Sprawdza czy dany obiekt jest obiektem danej klasy lub klasy pochodnej Sprawdza czy dany obiekt implementuje dany interfejs public String zrobcos( Klocek klocek) { if ( klocek instanceof Bomba) { zdetonuj();

Operator instanceof public class Bomba implements Wybuchowy { public class BombaAtomowa extends Bomba { public String wybuchnij( Wybuchowy wybuchowy) { if ( wybuchowy instanceof BombaAtomowa) { zniszczwszystko ();

Życie i śmierć obiektu 1 Polimorfizm i dziedziczenie 2 Życie i śmierć obiektu 3 Poziomy oraz modyfikatory dostępu 4 Obsługa wyjątków

Obszary pamięci - Stos i Sterta Stos Tutaj żyją wywołania metod i zmienne lokalne Sterta Tutaj żyją wszystkie obiekty

Bombowy kod 1 public class Bomba{ public void zdetonuj(){ double liczba = Math random(); eksploduj( liczba < 05 ); public void eksploduj( boolean napewno ){ zniszczplansze( 4, 5 ); Systemoutprintln("Zniszczono"); public void zniszczplansze( int x, int y ) { // niszczy plansze

Bombowy kod na Stosie

Bombowy kod na Stosie public void zdetonuj(){ double liczba = Math random(); eksploduj( liczba < 05 );

Bombowy kod na Stosie public void eksploduj( boolean napewno ){ zniszczplansze( 4, 5 ); Systemoutprintln("Zniszczono");

Bombowy kod na Stosie public void zniszczplansze( int x, int y ) { // niszczy plansze

Bombowy kod na Stosie public void eksploduj( boolean napewno ){ zniszczplansze( 4, 5 ); Systemoutprintln("Zniszczono");

Bombowy kod 2 public class Bomba{ public void zdetonuj(){ double liczba = Math random(); eksploduj( liczba < 05 ); public void eksploduj( boolean napewno ){ Wspolrzedne wsp= new Wspolrzedne (); zniszczplansze( wsp getx(), wsp gety() ); Systemoutprintln("Zniszczono"); public void zniszczplansze( int x, int y ) { // niszczy plansze

Bombowy kod na Stosie i Stercie public void eksploduj( boolean napewno ){ Wspolrzedne wsp= new Wspolrzedne (); zniszczplansze( wsp getx(), wsp gety() );

Bombowy kod na Stosie i Stercie // Metoda zdetonuj() wykonala sie i zostala zdjeta // ze stosu Zadna referencja nie wskazuje na // obiekt Wspolrzedne

Stos i Sterta - Podsumowanie 1 W Javie są dwa obszary pamięci - stos i sterta 2 Wszystkie zmienne lokalne istnieją na stosie, w ramce odpowiadającej metodzie, w której zostały zadeklarowane 3 Zmienne referencyjne zachowują się tak samo jak zmienne typów prostych - jeżeli odwołanie zostało zdeklarowane jako zmienna lokalna, to będzie przechowywane na stosie 4 Wszystkie obiekty przechowywane są na stercie, niezależnie od tego, czy odwołania wskazujące na nie są zmiennymi egzemplarza czy też zmiennymi lokalnymi

Kiedy umierają obiekty na Stercie? Życie obiektu na Stercie Obiekt istnieje, dopóki istnieją aktywne odwołania (referencje) do niego Gotowość do ośmiecenia Obiekt zostaje uznany za nadający się do odśmiecenia, kiedy przestanie istnieć ostatnie aktywne odwołanie wskazujące na niego Garbage Collector Kiedy programowi zacznie brakować pamięci, Garbage Collector (Odśmiecacz) usunie część lub wszystkie obiekty przeznaczone do odśmiecenia

Poziomy oraz modyfikatory dostępu 1 Polimorfizm i dziedziczenie 2 Życie i śmierć obiektu 3 Poziomy oraz modyfikatory dostępu 4 Obsługa wyjątków

Poziomy dostępu Dostęp do elementu w zależności od poziomu prywatny (private) - wyłącznie kod należący do tej samej klasy Element jest prywatny w ramach klasy, a nie obiektu Jeden Pies ma dostęp do prywatnych elementów drugiego Psa, jednak Kot nie będzie mógł z nich korzystać

Poziomy dostępu Dostęp do elementu w zależności od poziomu prywatny (private) - wyłącznie kod należący do tej samej klasy Element jest prywatny w ramach klasy, a nie obiektu Jeden Pies ma dostęp do prywatnych elementów drugiego Psa, jednak Kot nie będzie mógł z nich korzystać pakietowy / domyślny (default) - wyłącznie kod należący do tego samego pakietu

Poziomy dostępu Dostęp do elementu w zależności od poziomu prywatny (private) - wyłącznie kod należący do tej samej klasy Element jest prywatny w ramach klasy, a nie obiektu Jeden Pies ma dostęp do prywatnych elementów drugiego Psa, jednak Kot nie będzie mógł z nich korzystać pakietowy / domyślny (default) - wyłącznie kod należący do tego samego pakietu chroniony (protected) - kod należący do tego samego pakietu oraz wszystkie klasy pochodne (niezależnie od pakietu)

Poziomy dostępu Dostęp do elementu w zależności od poziomu prywatny (private) - wyłącznie kod należący do tej samej klasy Element jest prywatny w ramach klasy, a nie obiektu Jeden Pies ma dostęp do prywatnych elementów drugiego Psa, jednak Kot nie będzie mógł z nich korzystać pakietowy / domyślny (default) - wyłącznie kod należący do tego samego pakietu chroniony (protected) - kod należący do tego samego pakietu oraz wszystkie klasy pochodne (niezależnie od pakietu) publiczny (public) - dowolny kod umieszczony w dowolnym miejscu programu

Modyfikatory dostępu Modyfikatory dostępu private protected public

Modyfikatory dostępu Modyfikatory dostępu private protected public A gdzie czwarty modyfikator? Pakietowy poziom dostępu jest stosowany domyślnie i nie ma swojego modyfikatora

Poziomy i modyfikatory dostępu public Tego modyfikatora możesz używać do określania poziomu dostępu do klas, stałych, konstruktorów oraz metod, które chcesz udostępnić całemu światu

Poziomy i modyfikatory dostępu public Tego modyfikatora możesz używać do określania poziomu dostępu do klas, stałych, konstruktorów oraz metod, które chcesz udostępnić całemu światu private Powinien być stosowany do zmiennych klasy oraz metod, które nie powinny być wywoływane przez kod spoza klasy

Poziomy i modyfikatory dostępu default Pakiety są zazwyczaj projektowane jako grupy współpracujących, powiązanych ze sobą klas Często stosowany, żeby umożliwić przetestowanie metody

Poziomy i modyfikatory dostępu default Pakiety są zazwyczaj projektowane jako grupy współpracujących, powiązanych ze sobą klas Często stosowany, żeby umożliwić przetestowanie metody protected Daje możliwość, żeby klasy pochodne, należące do innego pakietu niż klasa bazowa, miały dostęp (poprzez dziedziczenie) do obiektów chronionych

Obsługa wyjątków 1 Polimorfizm i dziedziczenie 2 Życie i śmierć obiektu 3 Poziomy oraz modyfikatory dostępu 4 Obsługa wyjątków

Obsługa wyjątków Zgłaszanie wyjątków Metoda zgłasza wyjątek, aby przekazać informację, że stało się coś złego

Metoda zgłaszająca wyjątek

Wywołanie ryzykownej metody try { file = new FileInputStream( filename); x = (byte) fileread(); catch ( FileNotFoundException ex) { ex printstacktrace ();

Hierarchia wyjątków

Wyjątki Obsługa wyjątków przez kompilator 1 Jeśli zgłaszasz wyjątek, musisz w deklaracji metody umieścić słowo kluczowe throws 2 Jeśli wywołujesz metodę zgłaszającą wyjątek, musisz potwierdzić, że zdajesz sobie sprawę z ryzyka

Wyjątki Obsługa wyjątków przez kompilator 1 Jeśli zgłaszasz wyjątek, musisz w deklaracji metody umieścić słowo kluczowe throws 2 Jeśli wywołujesz metodę zgłaszającą wyjątek, musisz potwierdzić, że zdajesz sobie sprawę z ryzyka Wyjątki niesprawdzane (ang unchecked exceptions) Wyjątki typu RuntimeException NIE są sprawdzane przez kompilator Można zgłaszać, przechwytywać i deklarować wyjątki tego typu, jednak nie trzeba

RuntimeException try { x = IntegerparseInt("2"); catch ( ParseException e) { x = 3; RuntimeException czyli wyjątki czasu wykonania programu Te wyjątki najczęściej wynikają z błędów w implementacji NullPointerException IndexOutOfBoundsException

Przechwytywanie wyjątków try { // jakis kod catch ( Wyjatek e) { // zrob cos

Przechwytywanie wyjątków try { // jakis kod catch ( Wyjatek e) { // zrob cos finally { // wywolaj niezaleznie od wyniku

Czy wyjątek został przechwycony? try { // jakis kod finally { // wykonaj niezaleznie od wyniku

Rezygnacja z obsługi wyjątku public void mojametoda() throws Wyjatek { try { // jakis kod finally { // wykonaj niezaleznie od wyniku

Rezygnacja z obsługi wyjątku public void mojametoda() throws Wyjatek { // blok try - catch - finally mozna pominac

Co zostanie wypisane na konsolę? public void mojametoda() throws Wyjatek { try { Systemoutprint("a"); throw new WyjatekA(); Systemoutprint("b"); catch ( WyjatekA ex) { Systemoutprint("c"); finally { Systemoutprint("d"); throw new Wyjatek(); Systemoutprint("e");

Co zostanie wypisane na konsolę? public void mojametoda() throws Wyjatek { try { Systemoutprint("a"); throw new WyjatekA(); Systemoutprint("b"); catch ( WyjatekA ex) { Systemoutprint("c"); finally { Systemoutprint("d"); throw new Wyjatek(); Systemoutprint("e"); Odp: acd

Koniec Dziękuję za uwagę