Programowanie Obiektowe
Java
Małgorzata Janik
Zakład Fizyki Jądrowej
malgorzata.janik@pw.edu.pl
http://java.fizyka.pw.edu.pl/
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 2/30
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.
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)
Struktura Programu Pakiety i Import
Struktura Klasy Instancja klasy
Metody
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
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());
} }
Struktura programu
//funkcja główna
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
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());
} }
Struktura programu
//funkcja główna
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 8/98
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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 9/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 10/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++
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, w oddzielnym pliku itp.
W Javie (ani w C#) nie występują.
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
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());
} }
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)
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());
} }
Struktura programu
//funkcja główna
Przykład 1: tworzenie instancji klasy
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 15/98
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);
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 16/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).
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).
Operator new zwraca referencję do nowo utworzonego obiektu.
KlasaPrzykladowa kp = new KlasaPrzykladowa();
KlasaPrzykladowa kp2 = new KlasaPrzykladowa(5,”tekst2”);
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 17/98
Struktura klasy
Jak stworzyć
instancję tej klasy?
public static void main(String[] args) {
… … } 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;
}
Przykład 2: tworzenie instancji klasy
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 18/98
Struktura klasy
Jak stworzyć
instancję tej 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;
}
Przykład 2: tworzenie instancji klasy
public static void main(String[] args) {
KlasaPrzykladowa kp = new KlasaPrzykladowa();
kp.wypisz();
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
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());
} }
Struktura programu
//funkcja główna
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 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.
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<10){
p.przesun(5, 10);
double d = p.odlegloscOdPoczatkuUkladu();
System.out.println(p +
" Odległość od (0, 0): " + d);
i++;
} }
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
Dziedziczenie
Tworzenie klas pochodnych Klasa Object
Konstruktory i Super
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) 28/98
Dziedziczenie
W jaki sposób zdefiniować klasę pochodną, dziedziczącą po już istniejącej?
public class KlasaPochodna extends KlasaPrzykladowa { public void wypisz()
{
System.out.println(x + " " + y + " " + tekst);
}
int y = 10;
}
public static void main(String[] args) {
//KlasaPrzykladowa kp = new KlasaPrzykladowa();
KlasaPochodna kp = new KlasaPochodna();
kp.wypisz();
}
Efekt?
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;
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 29/98
Dziedziczenie
W jaki sposób zdefiniować klasę pochodną, dziedziczącą po już istniejącej?
public class KlasaPochodna extends KlasaPrzykladowa { public void wypisz()
{
System.out.println(x + " " + y + " " + tekst);
}
int y = 10;
}
public static void main(String[] args) {
//KlasaPrzykladowa kp = new KlasaPrzykladowa();
KlasaPochodna kp = new KlasaPochodna();
kp.wypisz();
}
0 10 domyslny 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;
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 30/98
Szybkie tworzenie klasy pochodnej w Eclipse
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 31/98
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ów
KlasaPrzykladowa() { x = 0;
tekst = "domyslny";
}
// deklaracje metod public void wypisz() {
System.out.println(x + " " + tekst);
}
// deklaracje pól int x;
String tekst;
}
Klasa Nadrzędna
“Superclass”
Klasa Pochodna (podrzędna)
“Subclass”
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 32/98
[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.
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) 33/98
Szybkie tworzenie klasy (Object)
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 34/98
public class Punkt {
//konstruktor dwuargumentowy
Punkt (double parametr1, double parametr2){
x = parametr1;
y = parametr2;
}
//pola
double 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;
}
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 35/98
Klasa Object
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 36/98
Klasa Object
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 37/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;
}
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 38/98
Klasa Object
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 39/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 40/98
[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) 41/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)
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 42/98
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) 43/98
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 (nie trzeba pisać jawnie) super(p1, p2) jest takim samym wywołaniem konstruktora jak: new Punkt(p1,p2)
Konstruktory i dziedziczenie
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 44/98
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) 45/98
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;
} }
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) 46/98
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;
} }
Konstruktory i dziedziczenie
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 47/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(...);
...
} …
}
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 48/98
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) 49/98
Odwołanie do Nadklasy przez „super”
• Odwołanie do elementu nad-klasy:
super.pole
super.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) 50/98
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) 51/98
Szybkie tworzenie klasy pochodnej w Eclipse
Stwórz metody:
●
Konstruktory z
klasy nadrzędnej
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 52/98
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) 53/98
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)
Przygotowanie do laboratorium Komponenty w Javie
Podpowiedzi Eclipse’a
Layout Manager
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 55/98
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)
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 56/98
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)
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 57/98
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 powoduje zamkniecia aplikacji. Aby to zmienić, należy
wywołać metodę setDefaultCloseOperation().
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 58/98
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) 59/98
Frame
Własne okienko [przykład]
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 60/98
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);
} }
Dziedziczenie po JFrame
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 61/98
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) 62/98
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) 63/98
Dodawanie komponentu
●
utworzenie komponentu (obiektu pewnej klasy) oraz ustawienie jego właściwości
– Komponent komponent = new Komponent(arg);
●
wywołanie metody add() kontenera do którego chcemy dodać nasz komponent
– 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);
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 64/98
Okno
public class MyFrame extends JFrame { public MyFrame()
{
this.setSize(640,480);
}
public static void main(String[] args) { MyFrame mf = new MyFrame();
mf.setVisible(true);
} }
Konstruktor okna
Stworzenie instancji (egzemplarza) okna i wyświetlenie go
JFrame
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 65/98
Okno z przyciskiem
1. Utworzenie komponentu
2. Wywołanie metody add
Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie...
JFrame
JButton
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 66/98
Panel (w oknie) z przyciskiem
1. Utworzenie panelu
2. Umieszczenie panelu w oknie
4. Umieszczenie guzika w panelu (który jest w oknie) 3. Utworzenie kontrolki (guzika) Wewnątrz konstruktora okna dodajemy komponenty
które powinny się znaleźć w tym oknie…
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 67/98
Kilka kontrolek
1. Utworzenie panelu i dodanie go do okna
3. Umieszczenie kontrolek w panelu
2. Utworzenie kontrolek
Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie…
public class KilkaKontrolek extends JFrame { public KilkaKontrolek()
{
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");
panel.add(b1); panel.add(b2); panel.add(b3);
panel.add(l1); panel.add(l2);
panel.add(tf1);
}
public static void main(String[] args) { KilkaKontrolek okno = new KilkaKontrolek();
okno.setVisible(true);
} }
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 68/98
●
JButton
●
JCheckBox
●
JComboBox
●
JList
●
JMenu
●
JRadioButton
●
JSlider
●
JSpinner
• JTextField
• JPasswordField
Kontrolki Swing
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
Wybrane kontrolki Swing (podstawowe)
Więcej na stronie:
http://web.mit.edu/6.005/www/sp14/psets/ps4/java-6-tutorial/components.html
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 70/98
Kontrolki do wyświetlania informacji oraz 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) 71/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 72/98
Layout Manager
● Czyli jak ułożyć kontrolki w okienku?
– Zwykle nie chcemy “nawrzucać” ich jednej
po drugiej do okna
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 73/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:
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 74/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)
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 75/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 76/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 77/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 78/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 79/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)
Quiz time
Co to za Layout?
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 81/98
1. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 82/98
1. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
CENTER PAGE_END
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 83/98
2. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 84/98
2. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 85/98
3. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 86/98
3. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
PAGE_START LINE_START LINE_END
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 87/98
4. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 88/98
4. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
2 x 2
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 89/98
5. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 90/98
5. Co to za Layout?
(a) BorderLayout (b) FlowLayout (c) GridLayout
PAGE_START LINE_START
3 x 1
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 91/98
Layout Manager
● W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów
Przykład kodu na
stronie przedmiotu!
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 92/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...
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 93/98
Layout Manager
● W ramach osobnych paneli można
zastosować różne typ zarządzania
rozmieszczeniem komponentów
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 94/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 95/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
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 96/98
Rozmiary komponentów
–
Silnie zależą od użytego Layout Managera
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 97/98
Dziękuję za Uwagę!
Do zobaczenia za tydzień.
Porozmawiamy o interfejsach i obsłudze zdarzeń.
M.in. jak oprogramować używanie guzików.
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 98/98
Ciekawostki
this
Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)