83
Programowanie Obiektowe Java Małgorzata Janik Zakład Fizyki Jądrowej [email protected] http://java.fizyka.pw.edu.pl/

Programowanie Obiektowe Javajava.fizyka.pw.edu.pl/data/_uploaded/data/Wyklady2018/...Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) Programowanie strukturalne Definicja:

  • Upload
    others

  • View
    23

  • Download
    0

Embed Size (px)

Citation preview

  • Programowanie Obiektowe

    JavaMałgorzata Janik

    Zakład Fizyki Ją[email protected]

    http://java.fizyka.pw.edu.pl/

  • 2/30Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    ● Szczegoły na temat projektów można znaleźć na stronie:● http://java.fizyka.pw.edu.pl/Projekty

    Projekty

    Targi Pracy IThttps://targipracyit.pl/PW

    http://java.fizyka.pw.edu.pl/Projekty

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Powtórzenie

    Który element Javy sprawia, że stosunkowo łatwo odpalać programy na

    różnych platformach / systemach operacyjnych ?

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Maszyna Wirtualna

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Pliki nagłówkowe

    W C/C++ używaliśmy plików nagłówkowych (.h lub .hpp) zawierające opis interfejsu modułu:● Deklaracje zmiennych, funkcji, klas, itp.

    W Javie (ani w C#) nie występują.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie Obiektowe

    Trochę historiiProgramowanie Strukturalne

    Programowanie Zorientowane ObiektowoZachowania i Atrybuty

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zamierzchła przeszłość

    ● Pierwsze komputery były programowane bezpośrednio z użyciem kodu maszynowego lub z wykorzystaniem asemblera. Pierwsze asemblery przypadają na połowę lat 50.

    Przykład kodu maszynowego (kolumna druga rozpoczynająca się od 6C 36 00) 

    Przykład kodu asemblera dla procesora Motorola 8-bit 6800

    Źródło: Wikipedia

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zamierzchła przeszłość

    ● Pierwsze komputery były programowane bezpośrednio z użyciem kodu maszynowego lub z wykorzystaniem asemblera. Pierwsze asemblery przypadają na połowę lat 50.

    ● Kontrola przepływu w programie odbywała się głównie przy pomocy warunkowych i bezwarunkowych instrukcji skoku.

    ● Instrukcja “skoku” (goto) pozwala na powtórne wykorzystanie tego samego fragmentu kodu– ale sprawia też, że program

    jest zdecydowanie mniej czytelny.

    Fragmentu kodu w Perlu

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowania radosne początki

    ● Jeżeli znamy podstawowe konstrukcje algorytmiczne i potrafimy je zagnieżdżać, wówczas teoretycznie jesteśmy w stanie napisać każdy algorytm.

    ● Jednakże, długość kodu programu nastaje się coraz większa i po pewnym czasie nie jesteśmy w stanie objąć wszystkiego wzrokiem i umysłem.

    ● Zastosowanie podprogramu (np. funkcji) pozwala podzielić algorytm na zbiór mniejszych, wydzielonych części.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie strukturalne● Definicja: paradygmat programowania opierający się na podziale kodu

    źródłowego programu na procedury i hierarchicznie ułożone bloki.● Rozwijał się w opozycji do programowania wykorzystującego proste

    instrukcje warunkowe i skoki (goto).● Początki programowania strukturalnego przypadają na Lata 60. XX wieku,

    a ważnym głosem w dyskusji o programowaniu strukturalnym był list Edsgera Dijkstry z 1974 roku: “Instrukcja goto powinna zostać usunięta z wszystkich „wysokopoziomowych” języków programowania (to znaczy z wszystkich poza - prawdopodobnie - czystym kodem maszynowym”.

    ● Programowanie strukturalne zwiększa czytelność i ułatwia analizę programów, co stanowi znaczącą poprawę w stosunku do trudnego w utrzymaniu „spaghetti code” często wynikającego z użycia instrukcji goto.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie strukturalne● Definicja: paradygmat programowania opierający się na podziale kodu

    źródłowego programu na procedury i hierarchicznie ułożone bloki.● Rozwijał się w opozycji do programowania wykorzystującego proste

    instrukcje warunkowe i skoki (goto).● Początki programowania strukturalnego przypadają na Lata 60. XX wieku,

    a ważnym głosem w dyskusji o programowaniu strukturalnym był list Edsgera Dijkstry z 1974 roku: “Instrukcja goto powinna zostać usunięta z wszystkich „wysokopoziomowych” języków programowania (to znaczy z wszystkich poza - prawdopodobnie - czystym kodem maszynowym”.

    ● Programowanie strukturalne zwiększa czytelność i ułatwia analizę programów, co stanowi znaczącą poprawę w stosunku do trudnego w utrzymaniu „spaghetti code” często wynikającego z użycia instrukcji goto.

    Spagetti code = trudny do zrozumienia kod źródłowy programu.Używano wielu instrukcji warunkowych i następnych w nich zagnieżdżonych konstrukcji GOTO. Droga przez kolejne rozkazy była tak poplątana, że odczytanie takiego kodu i zrozumienie go było bardzo uciążliwe, a ewentualne modyfikacje zwykle prowadziły do błędów w programie.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie strukturalne

    ● Programowanie strukturalne polega na tworzeniu programów wyłącznie w oparciu o trzy kompozycje algorytmiczne: – Sekwencyjną (instrukcje wykonują się jedna po

    drugiej), – Warunkową (instrukcje warunkowe if, if else, switch)– Iteracyjną (pętle for, while, do while).

    ● Zabronione są algorytmy wykorzystujące instrukcję skoku (GOTO).

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    ● W przypadku programowania strukturalnego często mamy doczynienia z danymi ,które muszą być widoczne w całym programie (dla wielu funkcji) i wiele funkcji może je zmieniać = tzw. dane globalne.

    ● W takim wypadku każda funkcja może zmienić dane, które mają wpływ na działanie wszystkich innych elementów prorgamu. Czyli jedna niewielka zmiana może “popsuć” działanie całego kodu w wielu różnych miejscach.

    Problemy z programowaniem strukturalnym

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Problemy z programowaniem strukturalnym

    ● Koncepcja programowania obiektowego pierwotnie pojawiła się w Simuli 67, języku zaprojektowanym do zastosowań symulacyjnych, stworzonym przez Ole-Johana Dahla i Kristena Nygaarda z Norsk Regnesentral w Oslo.– Mówi się, że pracowali oni nad symulacjami zachowania się statków

    i mieli kłopoty z opanowaniem wszystkich zależności , jakie wywierały na siebie nawzajem wszystkie parametry statków w symulacji. Wtedy wpadli na pomysł, by pogrupować typy statków w różne klasy obiektów, a każda z klas sama odpowiadałaby za określanie własnych danych i zachowań.

    ● Upraszczamy program, grupując kod w klasy, w których każda jest odpowiedzialna tylko za samą siebie (swoje dane i swoje funkcje)

    ● Programowanie obiektowe zyskało status techniki dominującej w połowie lat 80 (dzięki C++)

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie Obiektowe

    ● Programy definiujemy za pomocą obiektów.● Koncepcja obiektów fizycznych jest znana

    każdemu– Możemy sobie wyobrazić samochód, człowieka,

    toster.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie Obiektowe

    ● Programy definiujemy za pomocą obiektów.● Koncepcja obiektów fizycznych jest znana

    każdemu.● Obiekty w programowaniu to są modele

    rzeczywistych obiektów fizycznych.

    Samochód- kolor ZIELONY

    - marka DAEWOO

    + Tankuj()

    + Jedź()

    Samochód- kolor ZIELONY

    - marka DAEWOO

    + Tankuj()

    + Jedź()

    Człowiek- nazwisko EINSTEIN

    - zawód FIZYK

    + Śpij()

    + GenerujNobla()

    Toster- producent HB

    - typ POP-UP

    + Grzej()

    + WyrzućTosty()

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie Obiektowe

    ● Obiekty w programie reprezentują w pewnym stopniu obiekty rzeczywiste– Jeśli chcemy zaprogramować aplikacje dla zarządzania

    szpitalem, zapewne będziemy musieli stworzyć obiekty odpowiadające pacjentom, lekarzom, pielęgniarkom, ochronie, …

    ● W rzeczywistości to obiekty oddziałują ze sobą. W przypadku programów komputerowych jest podobnie: obiekty wysyłają do siebie wiadomości (wywołanie funkcji na innym obiekcie), a czasem uzyskują informacje zwrotne (zwracane zmienne).

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie Obiektowe● Na obiekty składają się atrybuty i zachowania:

    ● Obiekty zawierają więc zarówno dane (wartości atrybutów) oraz zachowanie (możliwe akcje które dany obiekt może wykonać)

    ● “zarówno” - różnica między programowaniem proceduralnym a obiektowym

    Samochód- kolor ZIELONY

    - marka DAEWOO

    + Tankuj()

    + Jedź()

    Toster- producent HB

    - typ POP-UP

    + Grzej()

    + WyrzućTosty()

    atrybuty

    zachowania

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Programowanie Obiektowe● Na obiekty składają się atrybuty i zachowania:

    ● Dobrze zaprojektowany program zakłada, że wartości atrybutów nie może zmienić nic poza obiektem, do którego należą – czyli wszystkie zmiany następują poprzez wywołanie odpowiednich zachowań (wywołanie funkcji)– Enkapsulacja, metody “Set” i “Get”.

    Każdy obiekt odpowiada za swoje dane.

    Samochód- kolor ZIELONY

    - marka DAEWOO

    + Tankuj()

    + Jedź()

    Toster- producent HB

    - typ POP-UP

    + Grzej()

    + WyrzućTosty()

    atrybuty

    zachowania

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Atrybuty i ich wartości

    ● Należy pamiętać, że atrybut (pole składowe) i jego wartość, to dwie różne rzeczy :

    – Każdy samochód będzie miał kolor, ale nie każdy będzie zielony.

    ● Sam atrybut jest jak pusta “formatka”, w którą możemy wpisywać wartości charakterystyczne dla naszego obiektu (konkretnej instancji naszej klasy).

    Samochód- kolor ZIELONY

    - marka DAEWOO

    atrybuty wartości atrybutów

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Atrybuty i ich wartości

    ● Należy pamiętać, że atrybut (pole składowe) i jego wartość, to dwie różne rzeczy :

    ● Sam atrybut jest jak pusta “formatka”, w którą możemy wpisywać wartości charakterystyczne dla naszego obiektu (konkretnej instancji naszej klasy).

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zachowania i atrybuty na przykładzie

    public class Punkt {

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }public String Wypisz(){

    String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    } double x , y;

    }

    public static void main(String[] args) {Punkt p1 = new Punkt (30,30);System.out.println(p1.Wypisz());

    }

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zachowania i atrybuty na przykładzie

    public class Punkt {

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }public String Wypisz(){

    String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    } double x , y;

    }

    public static void main(String[] args) {Punkt p1 = new Punkt (30,30);System.out.println(p1.Wypisz());

    }

    W programowaniu obiektowym klasa reprezentuje obiekty.

    Definicja klasy zwykle nie reprezentuje konkretnego obiektu, ale raczej “typ”.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zachowania i atrybuty na przykładzie

    public class Punkt {

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }public String Wypisz(){

    String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    } double x , y;

    }

    public static void main(String[] args) {Punkt p1 = new Punkt (30,30);System.out.println(p1.Wypisz());

    }

    Instancja klasy = konkretny obiekt.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zachowania i atrybuty na przykładzie

    public class Punkt {

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }public String Wypisz(){

    String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    } double x , y;

    }

    public static void main(String[] args) {Punkt p1 = new Punkt (30,30);System.out.println(p1.Wypisz());

    }

    Atrybuty. Zwykle nazywamy je polami (ang. fields).Nie powinny być dostępne z zewnątrz.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Zachowania i atrybuty na przykładzie

    public class Punkt {

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }public String Wypisz(){

    String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    } double x , y;

    }

    public static void main(String[] args) {Punkt p1 = new Punkt (30,30);System.out.println(p1.Wypisz());

    }

    Zachowania / akcje, które możemy wywołać na naszym obiekcie.Np. utworzenie obiektu o konkretnych wartościach atrybutów czy zwrócenie informacji o obiekcie w postaci napisu (String). Czyli funkcje składowe (metody).

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Obiektowa Java vs. C++

    ● W latach ‘90 to C++ był uważany za “lidera” programowania obiektowego.

    ● Ale C++ jest językiem “hybrydowym”:– pozwala na programowanie strukturalne, bądź

    obiektowe, bądź miksowanie obu paradygmatów– co w oczywisty sposób może prowadzić (i często

    prowadzi) do powstawania kodu który jest skomplikowany i trudny w utrzymaniu

    ● Java stworzona została od początku jako język służący do programowania obiektowego

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    PowtórzenieStruktura Programu

    Struktura KlasyMetody

    Dziedziczenie

    Oraz nowościKlasa Object

    Konstruktory i Super

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    package ... //deklaracja pakietu, opcjonalna ale zalecanaimport ... // deklaracje importu

    public class Punkt { //deklaracje konstruktorów

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }

    //deklaracje metodpublic String Wypisz(){

    String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    }

    //deklaracje pól double x , y;

    }public class KlasaStartowa {

    public static void main(String[] args) {Punkt p1 = new Punkt (30,30);System.out.println(p1.Wypisz());

    }}

    Struktura programu

    //funkcja główna

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    class NazwaKlasy {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    class NazwaKlasy {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

    Metody=

    Funkcje składowe

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Definiowanie metody

    [modyfikatory] TypZwracanejWartości nazwaMetody (TypArgumentu1 zmienna1, …,TypArgumentuN zmiennaN) {

    TypZwracanejWartości zwracanaWartość;

    // kod metody, w którym można korzystać ze zmiennych 1..N

    return zwracanaWartość;

    // jeśli metoda „void” - nic nie zwraca

    }

    • Metody mogą być zadeklarowane bezpośrednio w klasie lub odziedziczone po nadklasach lub interfejsach.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Punkt extends Object{double x = 0 , y = 0;

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }

    void przesun(double parametr1, double parametr2){x += parametr1;y += parametr2;

    }

    double odlegloscOdPoczatkuUkladu(){return Math.sqrt(x*x+y*y);

    }

    String toString(){String text;text = "Wspolrzedne ("+ x + ", " + y + ")"; return text;

    }}

    Metody

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Korzystanie z utworzonych metod

    public class PunktTest2 { public static void main(String[] args) {

    Punkt p = new Punkt(0,0);int i=0;while (i

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    class NazwaKlasy {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    [modyfikatory] class NazwaKlasy [extends NazwaKlasyNadrzednej] [implements NazwaInterfejsu] {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    [modyfikatory] class NazwaKlasy [extends NazwaKlasyNadrzednej] [implements NazwaInterfejsu] {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    [modyfikatory] class NazwaKlasy [extends NazwaKlasyNadrzednej] [implements NazwaInterfejsu] {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

    “extends” oznacza dziedziczenie = rozszerzenie klasy nadrzędnej

    Możemy dziedziczyć po własnych klasach, albo tych zawartych w standardowym API.

    Jeśli chcemy uzyskać spersonalizowaną ramkę, dziedziczymy po JFrame.Jeśli chcemy uzyskać spersonalizowany przycisk, dziedziczymy po JButton.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 39/85

    Szybkie tworzenie klasy pochodnej w Eclipse

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Dziedziczenie

    public class KlasaPochodna extends KlasaPrzykladowa {

    public void wypisz(){System.out.println(x + " " + y + " " + tekst);}

    int y = 10;}

    package pl.wyklad1.klasapokazowa;

    public class KlasaPrzykladowa {

    // deklaracje konstruktorówKlasaPrzykladowa() {x = 0;tekst = "domyslny";}

    // deklaracje metod

    public void wypisz() {System.out.println(x + " " + tekst);}

    // deklaracje pólint x;String tekst;}

    Klasa Nadrzędna“Superclass”

    Klasa Pochodna(podrzędna)“Subclass”

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Szybkie tworzenie klasy (Object)

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    [modyfikatory] class NazwaKlasy [extends NazwaKlasyBazowej] [implements NazwaInterfejsu] {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

    “extends” oznacza dziedziczenie. Możemy dziedziczyć po własnych klasach, albo tych zawartych w standardowym API.

    Jeśli chcemy uzyskać ramkę, dziedziczymy po JFrame.Jeśli chcemy uzyskać przycisk, dziedziczymy po JButton.

    Tworząc nową klasę w Javie zawsze używamy dziedziczenia. Jeśli nie napiszemy jawnie “extends”,

    w takim wypadku dziedzicznymy po klasie Object.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Punkt {//konstruktor dwuargumentowyPunkt (double parametr1, double parametr2){

    x = parametr1;y = parametr2;

    }

    //poladouble x = 0 , y = 0;

    }

    Przykład:

    Nawet jeśli nie ma jawnego dziedziczenia, powstała klasa jest rozszrzerzeniem klasy Object - http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html .Powyższa deklaracji klasy jest równoważna temu:

    public class Punkt extends Object {double x = 0 , y = 0;

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }}

    http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Klasa Object

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Klasa Object

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Przykład przedefiniowania (przeciążenia) metody toString() odziedziczonej z klasy bazowej Object

    public class Punkt extends Object{double x = 0 , y = 0;

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }

    public String toString(){String text;text = "Wspolrzedne ("+ x + ", " + y + ")";return text;

    }}

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Klasa Object

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    metoda equals()Służy ona do porównywania, czy dwa obiekty są sobie równe. Implementując metodę equals(), należy pamiętać o kilku zasadach• metoda equals musi być zwrotna, czyli a.equals(a)==true.• metoda equals musi być symetryczna, czyli a.equals(b)==b.equals(a).• metoda equals musi być przechodnia, czyli jeżeli a.eqauls(b)==true i b.equals(c)==true to a.equals(c)==true. (Jednak gdy: a.equals(b)==false i b.equals(c)==false to a.equals(c) może być true)• metoda equals musi być konsekwenta, czyli gdy dwa razy (w różnych chwilach czasu) porównujemy te same obiekty, to wynik tego porównania powinien być taki sam.• obiekt jest nie równy null, czyli a.equals(null)==false dla każdego a nie będącego null

    To metoda, której powinniśmy używać porównując dwa obiekty.Np. dwa String-i:

    – if (ala == “Ala”) – źle!– if (ala.equals(“Ala”)) – dobrze

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    [modyfikatory] class NazwaKlasy [extends NazwaKlasyNadrzednej] [implements NazwaInterfejsu] {

    //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora } //deklaracje metod

    Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

    return obiektTyp1; } ...

    //deklaracje pól Typ pole1; ... Typ poleN;}

    Struktura klasy

    Konstruktory i dziedziczenie

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Konstruktor● Specjalna metoda danej klasy, wywoływana

    podczas tworzenia jej instancji. ● Podstawowym zadaniem konstruktora jest

    zainicjowanie obiektu.● W C++/Javie:

    – Nazywa się tak samo jak klasa– Nic nie zwraca (brak napisu void przed nazwą)– Może przyjmować:

    ● 0 parametrów (konstruktor domyślny / bezargumentowy)● kilka parametrów (konstruktory z argumentami)

    – Obiekt tej samej klasy (konstruktor kopiujący)

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Punkt{Punkt (){

    x = 0;y = 0;

    }

    Punkt (double parametr1, double parametr2){x = parametr1;y = parametr2;

    }

    Punkt (Punkt p){x = p.x;y = p.y;

    }

    double x, y;}

    Konstruktory

    Konstruktor domyślny

    Konstruktor z parametrami

    Konstruktor kopiujący

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Kolo extends Punkt {double promien = 0;

    public Kolo(double parametr1, double parametr2, double parametr3) {super(parametr1, parametr2);promien = parametr3;

    }

    public Kolo(){super();promien = 10;

    }

    public Kolo (Punkt p, double parametr ){super(p.x, p.y);promien = parametr;

    }

    public Kolo(Kolo k){super(k.x,k.y);promien = k.promien;

    }}

    Konstruktor kopiujący

    Konstruktor bezargumentowy – „domyślne” parametry klasy

    super(p1, p2) jest równoważne z: new Punkt(p1,p2)

    Konstruktory i dziedziczenie

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Kolo extends Punkt {double promien = 0;

    public Kolo(double parametr1, double parametr2, double parametr3) {super(parametr1, parametr2);promien = parametr3;

    }

    public Kolo(){

    promien = 10;}

    public Kolo (Punkt p, double parametr ){super(p.x, p.y);promien = parametr;

    }

    public Kolo(Kolo k){super(k.x,k.y);promien = k.promien;

    }}

    Konstruktor kopiujący

    Java stworzyłaby pusty konstruktor domyślny dla klasy nadrzędnej.

    Uwaga, jeśli klasa Punkt nie miałaby żadnego konstruktora: OK.

    Konstruktory i dziedziczenie

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Kolo extends Punkt {double promien = 0;

    public Kolo(double parametr1, double parametr2, double parametr3) {super(parametr1, parametr2);promien = parametr3;

    }

    public Kolo(){

    promien = 10;}

    public Kolo (Punkt p, double parametr ){super(p.x, p.y);promien = parametr;

    }

    public Kolo(Kolo k){super(k.x,k.y);promien = k.promien;

    }}

    Konstruktor kopiujący

    Implicit super constructor punkt() is undefined.

    Uwaga, jeśli klasa Punkt nie miałaby konstruktora bezargumentowego, ALE miała inny konstruktor, pojawi się błąd:

    Konstruktory i dziedziczenie

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Kolo extends Punkt {double promien = 0;

    public Kolo(double parametr1, double parametr2, double parametr3) {super(parametr1, parametr2);promien = parametr3;

    }

    public Kolo(){super(0,0);promien = 10;

    }

    public Kolo (Punkt p, double parametr ){super(p.x, p.y);promien = parametr;

    }

    public Kolo(Kolo k){super(k.x,k.y);promien = k.promien;

    }}

    Konstruktor kopiujący

    Konstruktory i dziedziczenie

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Użycie „super” jako Konstruktora

    • Konstruktory nie są dziedziczone• Wywołanie konstruktora nad-klasy: super(lista-parametrow)• Musi być pierwszą instrukcją konstruktora

    podklasy:class NadKlasa { ... }class PodKlasa extends NadKlasa {

    PodKlasa(...) { super(...);

    ... } …

    }

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class KoloTest { public static void main(String[] args) {

    Kolo a,b,c,d,e;// Wykorzystanie różnych konstruktorów:a = new Kolo (10,10,5);b = new Kolo();Punkt p1 = new Punkt (30,30);c = new Kolo (p1, 30);d = new Kolo (new Punkt(40,40), 40 );e = new Kolo(c);

    System.out.println("" + a + "\n" + b + "\n"+ c + "\n" + d + "\n"+ e);// Jeśli klasa pochodna Kolo nie ma zdefiniowanej własnej metody

    // toString() wykorzystywana jest metoda toString klasy bazowej Punkt

    System.out.println(new Kolo(60,60,60)); // tworzenie "chwilowego" // obiektu bez referencji, na potrzeby wywołania metody

    }}

    Użycie konstruktorów

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Odwołanie do Nadklasy przez „super”

    • Odwołanie do elementu nad-klasy:super.polesuper.metoda()

    • Stosowane szczególnie gdy składowe pod-klasy przesłaniają składowe nad-klasy o tych samych nazwach.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    public class Subclass extends Superclass {

    // przeciąża (nadpisuje) metodę z nadklasy public void printMethod() { super.printMethod(); System.out.println("Wypisano w podklasie"); } public static void main(String[] args) { Subclass s = new Subclass(); s.printMethod(); }}

    public class Superclass {

    public void printMethod() { System.out.println("Wypisano w nadklasie."); }}

    Użycie “super” w metodach

    Efekt:Wypisano w nadklasie.Wypisano w podklasie.

    Jeśli nadpiszemy metodęz nadklasy, ale nadal chcemy ją wykorzystać, możemy użyć słowa kluczowego “super”.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 60/85

    Szybkie tworzenie klasy pochodnej w Eclipse

    Stwórz metody:● Konstruktory z klasy nadrzędnej

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 61/85

    public class ZamykaneOkienko extends JFrame {

    public ZamykaneOkienko() throws HeadlessException {

    }

    public ZamykaneOkienko(GraphicsConfiguration arg0) {super(arg0);

    }

    public ZamykaneOkienko(String arg0) throws HeadlessException {super(arg0);

    }

    public ZamykaneOkienko(String arg0, GraphicsConfiguration arg1) {super(arg0, arg1);

    }

    /** * @param args */public static void main(String[] args) {ZamykaneOkienko zo = new ZamykaneOkienko();zo.setVisible(true);

    }

    Konstruktory klasy nadrzędnej dodane przez Eclipse’a

    Konstruktory z klasy nadrzędnej

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 62/85

    public class ZamykaneOkienko extends JFrame {

    public ZamykaneOkienko() throws HeadlessException {this.setSize(640,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}

    public ZamykaneOkienko(GraphicsConfiguration arg0) {super(arg0);this.setSize(640,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}

    public ZamykaneOkienko(String arg0) throws HeadlessException {super(arg0);this.setSize(640,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}

    public ZamykaneOkienko(String arg0, GraphicsConfiguration arg1) {super(arg0, arg1);this.setSize(640,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}

    /** * @param args */public static void main(String[] args) {ZamykaneOkienko zo = new ZamykaneOkienko();

    zo.setVisible(true);

    }

    Nasze “rozszerzenie” klasy nadrzędnej: konkretne ustawienia, dodatkowe elementy….

    Konstruktory klasy nadrzędnej dodane przez Eclipse’a

    Konstruktory z klasy nadrzędnej

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 63/85

    Szybkie tworzenie klasy pochodnej w Eclipse

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 64/85

    Szybkie tworzenie klasy pochodnej w Eclipse

    Metody abstrakcyjne (w C++ mówiliśmy “czysto wirtualne”) to metody niedokończone.

    Jeśli klasa nadrzędna ma takie metody, to musimy je dokończyć w klasie podrzędnej,

    by móc stworzyć obiekt danej klasy → Eclipse pomaga nam w tym przygotowując odpowiedni kod.

    Jeśli dana klasa nadrzędna nie ma takiej metody, zaznaczenie checkbox’a nic nie zmieni.

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

    Przygotowanie do laboratoriumKomponenty w Javie

    Podpowiedzi Eclipse’aLayout Manager

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 66/85

    JFrame frame = new JFrame();frame.setSize(640, 480);Frame.setDefaultCloseOperation(EXIT_ON_CLOSE);frame.setVisible(true);

    public class MyFrame extends JFrame {public MyFrame() {this.setSize(640,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}}

    public static void main(String[] args) {MyFrame mf = new MyFrame();mf.setVisible(true);

    }

    Komponenty

    Okienka: JFrame

    lub

    (zalecane)

    ● Dla domyślnego okna naciśnięcie [X] nie powodujezamkniecia aplikacji. Aby to zmienić, należy wywołać metodę setDefaultCloseOperation().

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 67/85

    SetDefaultCloseOperation()

    ● EXIT_ON_CLOSE– zamyka aplikację

    ● DISPOSE_ON_CLOSE – zamyka ramke, usuwa obiekt reprezentujacy ramke, ale

    pozostawia pracujaca aplikację

    ● DO_NOTHING_ON_CLOSE – nic nie robi

    (pozostawia ramke otwarta i kontynuuje prace aplikacji)

    ● HIDE_ON_CLOSE – ukrywa ramke pozostawiajac pracujaca aplikacje (domyślne)

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 68/85

    JFrame frame = new JFrame();frame.setSize(640, 480); frame.setVisible(true);

    public class MyFrame extends JFrame {public MyFrame() {

    this.setSize(640,480);}}

    public static void main(String[] args) {MyFrame mf = new MyFrame();mf.setVisible(true);

    }

    Komponenty

    Okienka: JFrame

    lub

    (zalecane)

    Kontener: JPanel

    JPanel panel = new JPanel();

    public class MyPanel extends JPanel {...}

    public static void main(String[] args) {MyPanel mp = new MyPanel();

    }

    lub

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 69/85

    Komponenty

    Guzik: JButton

    Pole tekstowe: JTextField

    Etykieta: JLabel

    JButton buttonOK = new JButton("OK");panel.add(buttonOK);

    JLabel label = new JLabel("To jest etykieta");panel.add(label);

    JTextField field = new JTextField("To jest pole tekstowe");panel.add(field);

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 70/85

    Dodawanie komponentu

    ● utworzenie komponentu (obiektu pewnej klasy) oraz ustawienie jego właściwości– Komponent komponent = new Komponent(arg);

    ● określenie kontenera pośredniego – panelu z zawartością (ang. content pane) - czasem

    ● wywołanie metody add() kontenera lub kontenera pośredniego– kontener.add(komponent)

    ● Kontener (np. JPanel) to także rodzaj komponentu, i może być dodany jako element innego kontenera– panelGlowny.add(panelMniejszy)

    JButton button1 = new JButton("OK");panel.add(button1);

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 71/85

    Okno z przyciskiem

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 72/85

    Podpowiedzi Eclipse’a● Pamiętajcie o możliwości naciśnięcia ikonki błedu po

    lewej stronie, żeby:– Dodać odpowiednie klasy (import-y)– Uzyskać podpowiedź

    jak naprawić błąd

    ● Jeśli szukacie odpowiedniej metody, zawsze warto nacisnąć kropkę i przejrzeć listę dostępnych funkcji– Listę można też przywołać naciskając

    CTRL + spacja

    https://help.eclipse.org

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 73/85

    ● JButton● JCheckBox● JComboBox● JList● JMenu● JRadioButton● JSlider● JSpinner

    • JTextField• JPasswordField

    Kontrolki Swing

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 74/85

    Kontrolki do wyświetlania informacjioraz kontrolki najwyższego poziomu

    ● JLabel● JProgressBar● JSeparator● JToolTip

    ● JPanel● JScrollPane● JSplitPane● JTabbedPane● JToolBar● JInternalFrame● JLayeredPane● RootPane

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 75/85

    Rozmieszczanie komponenetówLayout Manager

    ● Sposób rozmieszczenia komponentów zależny od zarządcy układu (Layout Manager)

    ● Zastosowanie zarządcy układu w kontenerze – metoda setLayout()● Predefiniowani zarządcy układu

    – ciągły – FlowLayout– siatkowy - GridLayout– brzegowy – BorderLayout– kartowy – CardLayout– torebkowy - GridBagLayout– pudełkowy – BoxLayout– wiosenny – SpringLayout– grupowy - GroupLayout

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 76/85

    Layout Manager

    ● FlowLayout– Najprostszy layout manager

    i domyślny dla każdego JPanel’u.

    – Wrzuca komponenty jeden po drugim do pojedynczego wiersza. Jeśli zabraknie miejsca w danym wierszu, wrzuca do kolejnego.

    – Umieszczenie komponentów zależy od rozmiaru kontenera, więc nie możemy jasno określić, w którym dokładnie miejscu wyląduje nasz guzik.

    https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 77/85

    Layout Manager● GridLayout

    – GridLayout ustala ten sam rozmiar dla wszystkich komponentów po czym wrzuca je w siatkę o określonej ilości kolumn i wierszy.

    http://www.thaicreate.com/java/java-gui-layout-gridlayout.html

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 78/85

    Layout Manager

    ● BorderLayout– Możliwe składniki:

    ● PAGE_START● LINE_START● CENTER● LINE_END● PAGE_END

    – Wygodne do robienia np. menu po lewej stronie albo nagłówka i stopki.

    – Nie wszystkie składniki muszą być dodane

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 79/85

    Layout Manager● W ramach osobnych paneli można

    zastosować różne typ zarządzania rozmieszczeniem komponentów

    BorderLayout (gówny, lewy i centrum) + 2 x GridLayout

    BorderLayout + GridLayout ( 4 x 3 ) +GridLayout ( 5 x 1 ) +FlowLayout

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 80/85

    Layout Manager● W ramach osobnych paneli można

    zastosować różne typ zarządzania rozmieszczeniem komponentów

    BorderLayout (gówny, lewy i centrum) + 2 x GridLayout

    BorderLayout + GridLayout ( 4 x 3 ) +GridLayout ( 5 x 1 ) +FlowLayout

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 81/85

    Użycie LM

    JPanel panel1 = new JPanel(new FlowLayout());JPanel panel2 = new JPanel(new BorderLayout());

    panel1.add(aComponent1);panel2.add(aComponent2, BorderLayout.PAGE_START);

    Można też dawać wskazówki co do wielkości komponentów wywołując metody na konkretnych komponentach — setMinimumSize, setPreferredSize, and setMaximumSize.np.component.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));

    https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 82/85

    Rozmiary komponentów– Silnie zależą od użytego Layout Managera

  • Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 83/85

    Dziękuję za Uwagę!

    Do zobaczenia za tydzień.Porozmawiamy o interfejsach

    i obsłudze zdarzeń.

    m.in. jak oprogramować używanie guzików

    Slide1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35Slide 36Slide 37Slide 38Slide 39Slide 40Slide 41Slide 42Slide 43Slide 44Slide 45Slide 46Slide 47Slide 48Slide 49Slide 50Slide 51Slide 52Slide 53Slide 54Slide 55Slide 56Slide 57Slide 58Slide 59Slide 60Slide 61Slide 62Slide 63Slide 64Slide 65Slide 66Slide 67Slide 68Slide 69Slide 70Slide 71Slide 72Slide 73Slide 74Slide 75Slide 76Slide 77Slide 78Slide 79Slide 80Slide 81Slide 82Slide 83