Programowanie Obiektowe Java

Podobne dokumenty
Programowanie Obiektowe Java

Klasy abstrakcyjne. Klasę abstrakcyjną tworzymy przy pomocy modyfikatora abstract

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Struktura programu: package pl.mojastrona.mojpakiet; import javax.swing.*; import java.awt.container; class MojaKlasa extends Jframe {

Dokumentacja do API Javy.

Programowanie zdarzeniowe

Java - interfejs graficzny

Programowanie w Javie Wykład 6 Okienka w Javie (AWT)

Programowanie graficznego interfejsu użytkownika. Wykład 8. Maciej Wołoszyn 10 maja 2006

Podstawy Języka Java

Kontenery i komponenty graficzne

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Dziedziczenie. dr Jarosław Skaruz

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

Aplikacje w środowisku Java

Multimedia JAVA. Historia

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Java biblioteka Swing

Programowanie obiektowe

Programowanie obiektowe

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

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Programowanie obiektowe

Programowanie obiektowe

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie graficznych interfejsów użytkownika

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

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

Wykład 5 Okna MDI i SDI, dziedziczenie

Polimorfizm. dr Jarosław Skaruz

Wykład 7: Pakiety i Interfejsy

Wykład 4: Klasy i Metody

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

1 Atrybuty i metody klasowe

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

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Podstawy Języka Java

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

Rozdział 4 KLASY, OBIEKTY, METODY

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

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

Pierwsza ramka. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 10

Java niezbędnik programisty spotkanie nr 12. Graficzny interfejs użytkownika

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

Aplikacje w środowisku Java

Dziedziczenie. Tomasz Borzyszkowski

Wykład 6: Dziedziczenie

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

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

Programowanie w Internecie. Java

Programowanie zdarzeniowe

Podstawy programowania obiektowego

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

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

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

SWING. dr Jarosław Skaruz

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

SWING ZAGADNIENIA: wprowadzenie, kontenery I komponenty, LayoutManager, komponenty tekstowe.

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

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

Technologie i usługi internetowe cz. 2

Klasy abstrakcyjne i interfejsy

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

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

DOSTĘP DO METOD I ZMIENNYCH. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla każdego, Helion 2001)

Wykład 8: klasy cz. 4

Kurs programowania. Wykład 4. Wojciech Macyna. 23 marca 2016

Programowanie Obiektowe Java

PHP 5 język obiektowy

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie w języku JAVA. Wykład IV Swing - GUI

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

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie obiektowe

Język Java część 2 (przykładowa aplikacja)

Tworzenie elementów graficznych

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Marcin Luckner Warsaw University of Technology Faculty of Mathematics and Information Science

Języki i metody programowania Java Lab2 podejście obiektowe

TEMAT : KLASY DZIEDZICZENIE

Aplikacje w środowisku Java

Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy. Tworzenie łącz w apletach

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

Język Java część 2 (przykładowa aplikacja)

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

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

Kurs WWW. Paweł Rajba.

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

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie obiektowe

Wykład 5: Klasy cz. 3

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie obiektowe

Programowanie w Javie - wykład 3

Graphic User Interfaces pakiet Swing

Materiały do zajęć VII

DOSTĘP DO METOD I ZMIENNYCH, TABLICE. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla kaŝdego, Helion 2001)

Programowanie urządzeń mobilnych

Transkrypt:

Programowanie Obiektowe Java Małgorzata Janik Zakład Fizyki Jądrowej malgorzata.janik@pw.edu.pl http://java.fizyka.pw.edu.pl/

Projekt W drugim tygodniu zajęć należy wysłać prowadzącemu e-mail z informacją o: Członkach zespołu Pomyśle na projekt Temat projektu powinien zostać uzgodniony z prowadzącym laboratoria przed przygotowaniem specyfikacji Przykłady tematów na stronie http://java.fizyka.pw.edu.pl/lista-projektow Zawsze można wybrać własny projekt Tematy w danej grupie nie mogą się powtarzać (kto pierwszy ten lepszy) Wystarczy OK od prowadzącego Projekt jest realizowany zespołowo, ale uzyskana ocena jest indywidualna. Wkład każdego z członków zespołu będzie oceniany indywidualnie przez prowadzącego. 2/30

Powtórzenie Który element Javy sprawia, że stosunkowo łatwo odpalać programy na różnych platformach / systemach operacyjnych?

Maszyna Wirtualna

Struktura Programu Pakiety i Import Struktura Klasy Instancja klasy Metody

Struktura programu package... //deklaracja pakietu, opcjonalna ale zalecana import... // deklaracje importu public class Punkt { //deklaracje konstruktorów Punkt (double parametr1, double parametr2){ x = parametr1; y = parametr2; //deklaracje metod public 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()); //funkcja główna

Struktura programu package... //deklaracja pakietu, opcjonalna ale zalecana import... // deklaracje importu public class Punkt { //deklaracje konstruktorów Punkt (double parametr1, double parametr2){ x = parametr1; y = parametr2; //deklaracje metod public 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()); //funkcja główna

Pakiety Pakiet zbiór powiązanych klas i interfejsów, który pozwala na kontrolę dostępu i zapewnia hierarchiczny system nazewnictwa. Przykładami są: javax.swing, java.lang, java.io. pełna lista standardowych pakietów w dokumentacji 8/98

Pakiety programy w Javie są złożone z zestawów pakietów, zawierających definicje klas i interfejsów typ zadeklarowany w pakiecie jest dostępny na zewnątrz pakietu tylko gdy został zadeklarowany jako publiczny (public) nazwa pakietu powinna być niepowtarzalna i jednocześnie określać jego charakter. zaleca się by określić kraj pochodzenia pakietu przez standardowe, dwuliterowe kody ISO, np.. pl.edu.pw.fizyka.pojava.wyklad com.sun.examples pakiet składa się z kompilowalnych plików, które automatycznie mają dostęp do wszystkich typów deklarowanych w pakiecie jeśli plik nie zawiera deklaracji pakietu to domyślnie należy do pakietu unnamed/default 9/98

import By odnieść się do klasy MojaKlasa z paczki lab.pw możemy podać jej pełną (kwalifikowaną) nazwę: lab.pw.mojaklasa mk = new lab.pw.mojaklasa(); To jest konieczne, gdy w kilku różnych paczkach mamy klasę o tej samej nazwie W zwykłych przypadkach to nie jest wygodne; możemy skrócić ilość pisania używając dyrektywy import import lab.pw.mojaklasa; Wtedy w programie już możemy używać nazwy MojaKlasa. Dyrektywa import jest bardzo często wykorzystywana gdy wykorzystujemy dostępne API Wtedy możemy porównać ją do znanego nam #include z C/C++ 10/98

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, w oddzielnym pliku itp. W Javie (ani w C#) nie występują.

Struktura programu package... //deklaracja pakietu, opcjonalna ale zalecana import... // deklaracje importu public class Punkt { //deklaracje konstruktorów Punkt (double parametr1, double parametr2){ x = parametr1; y = parametr2; //deklaracje metod public 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()); //funkcja główna

Struktura klasy 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 programu package... //deklaracja pakietu, opcjonalna ale zalecana import... // deklaracje importu public class Punkt { //deklaracje konstruktorów Punkt (double parametr1, double parametr2){ x = parametr1; y = parametr2; //deklaracje metod public String Wypisz(){ String text; text = "Wspolrzedne ("+ x + ", " + y + ")"; return text; //deklaracje pól double x, y; Przykład 1: tworzenie instancji klasy public class KlasaStartowa { public static void main(string[] args) { Punkt p1 = new Punkt (30,30); System.out.println(p1.Wypisz()); //funkcja główna

Tworzenie obiektów NazwaKlasy zmienna; //deklaracja zmiennej/referencji zmienna = new NazwaKlasy(argumenty_konstruktora); //tworzenie nowego obiektu przypisanego do referencji Przykład: (tworzenie obiektu klasy Rectangle): Rectangle prostokat; prostakat = new Rectangle(10,10,100,200); Powyższy kod można uprościć, umieszczając deklarację zmiennej i tworzenie obiektu w jednej linii kodu: NazwaKlasy zmienna = new NazwaKlasy(argumenty_konstruktora); Przykład: Rectangle prostokat = new Rectangle(10,10,100,200); 15/98

ZAPAMIĘTAJ! Obiekty w Javie zawsze tworzone są przy pomocy operatora new po którym następuje konstruktor (czyli nazwa klasy, której obiekt jest tworzony oraz lista argumentów w nawiasach). KlasaPrzykladowa kp = new KlasaPrzykladowa(); Operator new rezerwuje pamięć dla nowego obiektu oraz wywołuje odpowiedni konstruktor (klasa może mieć więcej niż jeden konstruktor, o tym który zostanie wywołany decyduję zgodność listy argumentów). KlasaPrzykladowa kp2 = new KlasaPrzykladowa(5, tekst2 ); Operator new zwraca referencję do nowo utworzonego obiektu. 16/98

Struktura klasy Przykład 2: tworzenie instancji klasy package pl.wyklad1.klasapokazowa; public class KlasaPrzykladowa { // deklaracje konstruktorów KlasaPrzykladowa() { x = 0; tekst = "domyslny"; // deklaracje metod public void setx(int ax) { x = ax; public int getx() { return x; public void wypisz() { System.out.println(x + " " + tekst); // deklaracje pól int x; String tekst; Jak stworzyć instancję tej klasy? public static void main(string[] args) { 17/98

Struktura klasy Przykład 2: tworzenie instancji klasy package pl.wyklad1.klasapokazowa; public class KlasaPrzykladowa { // deklaracje konstruktorów KlasaPrzykladowa() { x = 0; tekst = "domyslny"; // deklaracje metod public void setx(int ax) { x = ax; public int getx() { return x; public void wypisz() { System.out.println(x + " " + tekst); // deklaracje pól int x; String tekst; Jak stworzyć instancję tej klasy? public static void main(string[] args) { KlasaPrzykladowa kp = new KlasaPrzykladowa(); kp.wypisz(); 18/98

Struktura programu package... //deklaracja pakietu, opcjonalna ale zalecana import... // deklaracje importu public class Punkt { //deklaracje konstruktorów Punkt (double parametr1, double parametr2){ x = parametr1; y = parametr2; Metody = Funkcje składowe //deklaracje metod public 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()); //funkcja główna

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 oraz pól klasy return zwracanawartość; // jeśli metoda void - nic nie zwraca Metody mogą być zadeklarowane bezpośrednio w klasie lub odziedziczone po nadklasach lub interfejsach.

Metody 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;

Korzystanie z utworzonych metod public class PunktTest2 { public static void main(string[] args) { Punkt p = new Punkt(0,0); int i=0; while (i<10){ p.przesun(5, 10); double d = p.odlegloscodpoczatkuukladu(); System.out.println(p + " Odległość od (0, 0): " + d); i++;

Dziedziczenie Tworzenie klas pochodnych Klasa Object Konstruktory i Super

Struktura klasy 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 [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 [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 [modyfikatory] class NazwaKlasy [extends NazwaKlasyNadrzednej] [implements NazwaInterfejsu] { //deklaracje konstruktorów extends oznacza dziedziczenie NazwaKlasy(lista parametrów){ = rozszerzenie klasy nadrzędnej //treść/zawartość konstruktora Możemy dziedziczyć po własnych klasach, albo tych zawartych w standardowym API. //deklaracje metod Jeśli chcemy uzyskać spersonalizowaną ramkę, dziedziczymy po JFrame. Jeśli chcemy uzyskać spersonalizowany przycisk, Typ1 metoda1(lista parametrów) { dziedziczymy po JButton. //treść/zawartość metody1 return obiekttyp1;... //deklaracje pól Typ pole1;... Typ polen;

Dziedziczenie package pl.wyklad1.klasapokazowa; public class KlasaPrzykladowa { W jaki sposób zdefiniować klasę pochodną, dziedziczącą po już istniejącej? public class KlasaPochodna extends KlasaPrzykladowa { // deklaracje konstruktorów KlasaPrzykladowa() { x = 0; tekst = "domyslny"; public void wypisz() { System.out.println(x + " " + y + " " + tekst); int y = 10; // deklaracje metod public void setx(int ax) { x = ax; public int getx() { return x; public void wypisz() { System.out.println(x + " " + tekst); // deklaracje pól int x; String tekst; public static void main(string[] args) { //KlasaPrzykladowa kp = new KlasaPrzykladowa(); KlasaPochodna kp = new KlasaPochodna(); kp.wypisz(); Efekt? 28/98

Dziedziczenie package pl.wyklad1.klasapokazowa; public class KlasaPrzykladowa { W jaki sposób zdefiniować klasę pochodną, dziedziczącą po już istniejącej? public class KlasaPochodna extends KlasaPrzykladowa { // deklaracje konstruktorów KlasaPrzykladowa() { x = 0; tekst = "domyslny"; public void wypisz() { System.out.println(x + " " + y + " " + tekst); int y = 10; // deklaracje metod public void setx(int ax) { x = ax; public int getx() { return x; public void wypisz() { System.out.println(x + " " + tekst); // deklaracje pól int x; String tekst; public static void main(string[] args) { //KlasaPrzykladowa kp = new KlasaPrzykladowa(); KlasaPochodna kp = new KlasaPochodna(); kp.wypisz(); 0 10 domyslny 29/98

Szybkie tworzenie klasy pochodnej w Eclipse 30/98

Dziedziczenie package pl.wyklad1.klasapokazowa; public class KlasaPrzykladowa { public class KlasaPochodna extends KlasaPrzykladowa { // deklaracje konstruktorów KlasaPrzykladowa() { x = 0; tekst = "domyslny"; public void wypisz() { System.out.println(x + " " + y + " " + tekst); int y = 10; // deklaracje metod public void wypisz() { System.out.println(x + " " + tekst); Klasa Pochodna (podrzędna) Subclass // deklaracje pól int x; String tekst; Klasa Nadrzędna Superclass 31/98

Struktura klasy [modyfikatory] class NazwaKlasy [extends NazwaKlasyBazowej] [implements NazwaInterfejsu] { //deklaracje konstruktorów NazwaKlasy(lista parametrów){ //treść/zawartość konstruktora extends oznacza dziedziczenie. Tworząc nową klasę w Javie zawsze używamy dziedziczenia. //deklaracjejeśli metod nie napiszemy jawnie extends, w takim wypadku dziedzicznymy po Typ1 metoda1(lista parametrów) { klasie Object. //treść/zawartość metody1 return obiekttyp1;... //deklaracje pól Typ pole1;... Typ polen; 32/98

Szybkie tworzenie klasy (Object) 33/98

Przykład: public class Punkt { //konstruktor dwuargumentowy Punkt (double parametr1, double parametr2){ x = parametr1; y = parametr2; //pola double x = 0, y = 0; 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; 34/98

Klasa Object 35/98

Klasa Object 36/98

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; 37/98

Klasa Object 38/98

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 39/98

Struktura klasy [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;... Konstruktory i dziedziczenie //deklaracje pól Typ pole1;... Typ polen; 40/98

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) 41/98

Konstruktory public class Punkt{ Punkt (){ x = 0; y = 0; Konstruktor domyślny Punkt (double parametr1, double parametr2){ x = parametr1; Konstruktor z y = parametr2; parametrami Punkt (Punkt p){ x = p.x; y = p.y; Konstruktor kopiujący double x, y; 42/98

Konstruktory i dziedziczenie super(p1, p2) jest takim samym wywołaniem konstruktora jak: new Punkt(p1,p2) 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; Konstruktor bezargumentowy domyślne parametry klasy (nie trzeba pisać jawnie) 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 43/98

Konstruktory i dziedziczenie 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; Uwaga, jeśli klasa Punkt nie miałaby żadnego konstruktora: OK. Java stworzyłaby pusty konstruktor domyślny dla klasy nadrzędnej. 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 44/98

Konstruktory i dziedziczenie public class Kolo extends Punkt { double promien = 0; public Kolo(double parametr1, double parametr2, double parametr3) { super(parametr1, parametr2); promien = parametr3; Uwaga, jeśli klasa Punkt nie miałaby konstruktora public Kolo(){ bezargumentowego, ALE miała inny konstruktor, promien = 10; pojawi się błąd: Implicit super constructor punkt() is undefined. 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; 45/98

Konstruktory i dziedziczenie 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; 46/98

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(...);... 47/98

Użycie konstruktorów 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 48/98

Odwołanie do Nadklasy przez super Odwołanie do elementu nad-klasy: super.pole super.metoda() Stosowane szczególnie gdy składowe podklasy przesłaniają składowe nad-klasy o tych samych nazwach. 49/98

Użycie super w metodach public class Superclass { public void printmethod() { System.out.println("Wypisano w nadklasie."); Jeśli nadpiszemy metodę z nadklasy, ale nadal chcemy ją wykorzystać, możemy użyć słowa kluczowego super. 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(); Efekt: Wypisano w nadklasie. Wypisano w podklasie. 50/98

Szybkie tworzenie klasy pochodnej w Eclipse Stwórz metody: Konstruktory z klasy nadrzędnej 51/98

Konstruktory z klasy nadrzędnej public class ZamykaneOkienko extends JFrame { public ZamykaneOkienko() throws HeadlessException { public ZamykaneOkienko(GraphicsConfiguration arg0) { super(arg0); public ZamykaneOkienko(String arg0) throws HeadlessException { super(arg0); Konstruktory klasy nadrzędnej dodane przez Eclipse a public ZamykaneOkienko(String arg0, GraphicsConfiguration arg1) { super(arg0, arg1); /** * @param args */ public static void main(string[] args) { ZamykaneOkienko zo = new ZamykaneOkienko(); zo.setvisible(true); 52/98

Konstruktory z klasy nadrzędnej 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); Nasze rozszerzenie klasy nadrzędnej: konkretne ustawienia, dodatkowe elementy. public ZamykaneOkienko(String arg0) throws HeadlessException { super(arg0); this.setsize(640,480); setdefaultcloseoperation(exit_on_close); Konstruktory klasy nadrzędnej dodane przez Eclipse a 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); 53/98

Przygotowanie do laboratorium Komponenty w Javie Podpowiedzi Eclipse a Layout Manager

Trzy najpopularniejsze rodzaje programów: aplikacja konsolowa samodzielny program pracujący w trybie konsolowym/tekstowym systemu operacyjnego, aplikacja graficzna samodzielny program pracujący w trybie graficznym (okienkowym) aplet najczesciej nieduzy program napisany w jezyk Java i umieszczony na stronie HTML i uruchamiany wraz z nia przez przegladarkę internetowa, obsługujaca jezyk Java. (deprecated - już nie stosowane) 55/98

Komponenty Okienka: JFrame lub 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); (zalecane) 56/98

Komponenty Okienka: JFrame lub 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); (zalecane) Dla domyślnego okna naciśnięcie [X] nie powoduje zamkniecia aplikacji. Aby to zmienić, należy wywołać metodę setdefaultcloseoperation(). 57/98

SetDefaultCloseOperation() EXIT_ON_CLOSE DISPOSE_ON_CLOSE zamyka aplikację 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) 58/98

Frame Własne okienko [przykład] 59/98

Dziedziczenie po JFrame package pl.wyklad1.klasapokazowa; import javax.swing.jframe; public class PierwszeOkienko extends JFrame { PierwszeOkienko() { this.setsize(500,500); public static void main(string[] args) { PierwszeOkienko po = new PierwszeOkienko(); po.setvisible(true); 60/98

Komponenty Okienka: JFrame JFrame frame = new JFrame(); frame.setsize(640, 480); frame.setvisible(true); lub public class MyFrame extends JFrame { public MyFrame() { this.setsize(640,480); public static void main(string[] args) { MyFrame mf = new MyFrame(); mf.setvisible(true); (zalecane) Kontener: JPanel JPanel panel = new JPanel(); lub public class MyPanel extends JPanel {... public static void main(string[] args) { MyPanel mp = new MyPanel(); 61/98

Komponenty Guzik: JButton JButton buttonok = new JButton("OK"); panel.add(buttonok); JLabel label = new JLabel("To jest etykieta"); panel.add(label); Etykieta: JLabel JTextField field = new JTextField("To jest pole tekstowe"); panel.add(field); Pole tekstowe: JTextField 62/98

Dodawanie komponentu utworzenie komponentu (obiektu pewnej klasy) oraz ustawienie jego właściwości wywołanie metody add() kontenera do którego chcemy dodać nasz komponent Komponent komponent = new Komponent(arg); kontener.add(komponent) Kontener (np. JPanel) to także rodzaj komponentu, więc może być dodany jako element innego kontenera panelglowny.add(panelmniejszy) JButton button1 = new JButton("OK"); panel.add(button1); 63/98

Okno public class MyFrame extends JFrame { public MyFrame() { Konstruktor okna this.setsize(640,480); public static void main(string[] args) { MyFrame mf = new MyFrame(); mf.setvisible(true); JFrame Stworzenie instancji (egzemplarza) okna i wyświetlenie go 64/98

Okno z przyciskiem Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie... 1. Utworzenie komponentu JFrame JButton 2. Wywołanie metody add Przykład kodu na stronie przedmiotu! 65/98

Panel (w oknie) z przyciskiem Przykład kodu na Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie stronie przedmiotu! 1. Utworzenie panelu 2. Umieszczenie panelu w oknie 3. Utworzenie kontrolki (guzika) 4. Umieszczenie guzika w panelu (który jest w oknie) 66/98

Kilka kontrolek Przykład kodu na stronie przedmiotu! Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie public class KilkaKontrolek extends JFrame { public KilkaKontrolek() 1. Utworzenie panelu i dodanie go do { okna this.setsize(400,400); this.setdefaultcloseoperation(exit_on_close); JPanel panel = new JPanel(); add(panel); JButton b1 = new JButton("Przycisk 1"); JButton b2 = new JButton("Przycisk 1"); JButton b3 = new JButton("Przycisk 1"); JLabel l1 = new JLabel("Napis 1"); JLabel l2 = new JLabel("Napis 2"); JTextField tf1 = new JTextField("Pole tekstowe"); 2. Utworzenie kontrolek panel.add(b1); panel.add(b2); panel.add(b3); panel.add(l1); panel.add(l2); panel.add(tf1); 3. Umieszczenie kontrolek w panelu public static void main(string[] args) { KilkaKontrolek okno = new KilkaKontrolek(); okno.setvisible(true); 67/98

Kontrolki Swing JButton JCheckBox JComboBox JList JMenu JRadioButton JSlider JSpinner JTextField JPasswordField 68/98

Wybrane kontrolki Swing (podstawowe) Więcej na stronie: http://web.mit.edu/6.005/www/sp14/psets/ps4/java-6-tutorial/components.html

Kontrolki do wyświetlania informacji oraz kontrolki najwyższego poziomu JLabel JPanel JProgressBar JScrollPane JSeparator JSplitPane JToolTip JTabbedPane JToolBar JInternalFrame JLayeredPane RootPane 70/98

Podpowiedzi Eclipse a Pamiętajcie o możliwości naciśnięcia ikonki błedu po lewej stronie, żeby: Dodać odpowiednie pakiety (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 71/98

Layout Manager Czyli jak ułożyć kontrolki w okienku? Zwykle nie chcemy nawrzucać ich jednej po drugiej do okna 72/98

Layout Manager Czyli jak ułożyć kontrolki w okienku? Zwykle nie chcemy nawrzucać ich jednej po drugiej do okna Co więcej, jeśli nie utworzymy panelu, a będziemy dodawać kontrolki bezpośrednio do JFrame, to widoczna będzie tylko ostatnia! Po dodaniu 5 przycisków widzimy ostatni: 73/98

Layout Manager Czyli jak ułożyć kontrolki w okienku? Od czego to zależy? Co możemy zrobić? Odpowiedź: zarządca układu (Layout Manger) 74/98

Rozmieszczanie komponenetów Layout Manager Sposób rozmieszczenia komponentów w danym kontenerze zależny jest od wybranego zarządcy układu (Layout Manager) JFrame i JPanel mają innych domyślnych zarządców 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 75/98

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 76/98

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 77/98

Layout Manager BorderLayout Domyślny dla JFrame 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 78/98

Layout Manager BorderLayout Wybrane składniki: PAGE_START LINE_START CENTER Wygodne do robienia np. menu po lewej stronie i nagłówka. Nie wszystkie składniki muszą być dodane 79/98

Quiz time Co to za Layout?

1. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout Przykład kodu na stronie przedmiotu! 81/98

1. Co to za Layout? (a) BorderLayout (b) FlowLayout CENTER PAGE_END (c) GridLayout Przykład kodu na stronie przedmiotu! 82/98

2. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout Przykład kodu na stronie przedmiotu! 83/98

2. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout Przykład kodu na stronie przedmiotu! 84/98

3. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout Przykład kodu na stronie przedmiotu! 85/98

3. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout PAGE_START LINE_START LINE_END Przykład kodu na stronie przedmiotu! 86/98

4. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout Przykład kodu na stronie przedmiotu! 87/98

4. Co to za Layout? (a) BorderLayout (b) FlowLayout 2x2 (c) GridLayout Przykład kodu na stronie przedmiotu! 88/98

5. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout Przykład kodu na stronie przedmiotu! 89/98

5. Co to za Layout? (a) BorderLayout (b) FlowLayout (c) GridLayout PAGE_START LINE_START 3x1 Przykład kodu na stronie przedmiotu! 90/98

Layout Manager W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów Przykład kodu na stronie przedmiotu! 91/98

Layout Manager W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów BorderLayout (górny, lewy i centrum) + GridLayout (po lewej) + FlowLayout (u góry) Każdy z paneli ma swój oddzielny layout, i każdy dodany jest do okna w innym miejscu... 92/98

Layout Manager W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów 93/98

Layout Manager W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów BorderLayout + GridLayout ( 4 x 3 ) + GridLayout ( 5 x 1 ) + FlowLayout 94/98

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 wymiarów 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 95/98

Rozmiary komponentów Silnie zależą od użytego Layout Managera 96/98

Dziękuję za Uwagę! Do zobaczenia za tydzień. Porozmawiamy o interfejsach i obsłudze zdarzeń. M.in. jak oprogramować używanie guzików. 97/98

Ciekawostki this 98/98

Słowo kluczowe this Czasem metoda obiektu potrzebuje odwołać się do obiektu wywołującego tę metodę. Umożliwia to słowo kluczowe this. Wewnątrz metody this oznacza obiekt, na rzecz którego wywołano metodę. W Java nie można deklarować dwóch takich samych zmiennych lokalnych w obrębie jednego zakresu, jednak istnieje możliwość przesłonięcia zmiennych instancyjnych klasy przez parametry metody. Wewnątrz metody zmienne instancyjne byłyby niedostępne, gdyby nie możliwość użycia zmiennej this: public class Punkt { double x = 0, y = 0; Punkt (double x, double y){ this.x = x; this.y = y;