Język Java Paweł Rajba pawel@wsiz.wroc.pl http://www.wsiz.wroc.pl/strony/pawel_rajba/
O czym dzisiaj będzie Struktura programu Klasy Pola, metody Zasięg identyfikatorów i specyfikatory dostępu Konstruktory i tworzenie obiektów Komunikacja z obiektami Statyczne składowe klasy Pakiety
Struktura programu package ... // deklaracja pakietu (niekoniecznie) import ... // deklaracja importów (często przydatne) import ... public class A { ... } class B class C
Struktura programu Ograniczenia w jednym pliku źródłowym może być tylko jedna klasa publiczna klasa publiczna musi dokładnie taką samą nazwę jak nazwa pliku (z dokładnością do małych i wielkich liter) Początek wykonywania programu metoda statyczna public static void main(String[] args) { ... } w jednej z klas (niekoniecznie publicznej)
Klasy Co to jest klasa? Składowe pola: zmienne i stałe, dane obiektu metody: funkcje, operują na danych obiektu Przykład klasy class Samochod { String marka, model, nr_rej, kolor; int rocznik; rejestruj() {} wyrejestruj() {} jedz() {} stoj() {} wlacz_swiatla() {} wylacz_swiatla() {} }
Pola i metody Deklaracja metod typ_wyniku Nazwa(lista_parametrów) { ...treść metody... } int suma(int x, int y) { return x+y; } Zestaw metod klasy nazywamy interfejsem tej klasy
Pola i metody Przykazywanie argumentów argumenty do metod przekazywane są tylko przez wartość Przykład: void dodajeden(int x) { ++x; } z=0; dodajeden(z); // i tutaj nadal z==0
Zasięg identyfikatorów Zasięg identyfikatora (zmiennej, stałej, metody) jest blok, którym jest on dostępny W konstruktorach i metodach można przesłaniać pola klasy class A { int x=10; void zrobcos() { int x=0; // dotyczy zmiennej lokalnej x+=1; // dotyczy zmiennej lokalnej ++this.x; // dotyczy pola klasy } }
Zasięg identyfikatorów Nie wolno przesłaniać zmiennych lokalnych w blokach wewnętrznych int x=0; if (x==0) { int x=5; // tak nie wolno ... } int i=0; for (int i; i<10; i++) { ... } // tak też nie wolno
Specyfikatory dostępu Regulują dostęp do pól i metod jednej klasy z innej klasy prywatna – dostępna tylko w danej klasie; specyfikator private zaprzyjaźniona – dostępna ze wszytkich klas danego pakietu; domyślna, bez specyfikatora chroniona lub zabezpieczona – dostępna z danej klasy i wszystkich jej klas potomnych; specyfikator protected publiczna – dostępna ze wszystkich klas; specyfikator public
Konstruktory Konstruktor uruchamiany raz przy tworzeniu obiektu nie zwraca żadnej wartości jego nazwa jest taka jak nazwa klasy Przykład class LZespolona { double re, im; LZespolona(double x, double y) { re=x; im=y; } void Pokaz() { ... } .... }
Tworzenie obiektów Obiekt tworzymy za pomocą operatora new Pierwsze użycie: NazwaKlasy nazwaobiektu = new NazwaKlasy(argumentu); Drugie użycie: NazwaKlasy nazwaobiektu; ... nazwaobiektu = new NazwaKlasy(argumentu)
Tworzenie obiektów Inicjalizacja pól Zasady Domyślne inicjalizacje każde odwołanie do klasy inicjuje najpierw pola statyczne tworzenie obiektu inicjuje pola niestatyczne, a następnie wykonywany jest konstruktor najpierw inicjowane są pola statyczne, a potem niestatyczne; wg kolejności deklaracji Domyślne inicjalizacje pola klasy mają zagwarantowane na wartości 0 zmienne lokalne nie mają zagwarantowanej domyślnej inicjalizacji pól
Tworzenie obiektów Przykład class LZespolona { double re, im; LZespolona(double x, double y) { re=x; im=y; } } LZespolona z1 = new LZespolona(1,2); LZespolona z2 = new LZespolona(3,4); Dostępne są dwie liczby: (1,2) i (3,4)
Komunikacja z obiektami Operowanie na obiektach dostęp do pól i metod jest przez operator . przykłady z1.re, z1.pokaz() Słowo kluczowe this znaczenie przyklad class LZespolona { double re, im; LZespolona(double re, double im) { this.re=re; this.im=im; } ... }
Klasy i obiekty Przykład 1 class ParaLiczb { int x, y; ParaLiczb(int x, int y) { this.x=x; this.y=y; } void Pokaz() { System.out.println(this.x+", "+this.y); } int Suma() { return x+y; } int Iloczyn() { return x*y; } }
Klasy i obiekty Przykład 1 c.d. public class Przyklad1 { public static void main(String[] args) { ParaLiczb p1 = new ParaLiczb(1,2); ParaLiczb p2 = new ParaLiczb(4,5); System.out.print("Dana jest para: "); p1.Pokaz(); System.out.println("Suma: "+p1.Suma()); System.out.println("Iloczyn: "+p1.Iloczyn()); System.out.print("Dana jest druga para: "); p2.Pokaz(); System.out.println("Suma: "+p2.Suma()); System.out.println("Iloczyn: "+p2.Iloczyn()); } }
Klasy i obiekty Przykład 2 class Punkt { double x, y; Punkt(double x, double y) { this.x=x; this.y=y; } double Odleglosc(Punkt p) { return Math.sqrt((this.x-p.x)*(this.x-p.x) +(this.y-p.y)*(this.y-p.y)); } }
Klasy i obiekty Przykład 2 c.d. public class Przyklad2 { public static void main(String[] args) { Punkt p1 = new Punkt(1,2); Punkt p2 = new Punkt(5,5); System.out.println("Odleglosc p1 od p2: " +p1.Odleglosc(p2)); System.out.println("Odleglosc p2 od p1: " +p2.Odleglosc(p1)); } }
Klasy i obiekty Przykład 3 class Punkt { double x, y; Punkt(double x, double y) { this.x=x; this.y=y; } double odleglosc(Punkt p) { return Math.sqrt((this.x-p.x)*(this.x-p.x) +(this.y-p.y)*(this.y-p.y)); } }
Klasy i obiekty Przykład 3 c.d. public class Przyklad3 { public static void main(String[] args) { Punkt[] t = new Punkt[3]; Punkt p = new Punkt(3,5); double odl = 0.0; t[0] = new Punkt(2,7); t[1] = new Punkt(4,5); t[2] = new Punkt(2,6); for (int i=0; i<t.length; i++) { if (p.odleglosc(t[i])>odl) { odl=p.odleglosc(t[i]); } } System.out.println(odl); } }
Statyczne składowe klasy Co to znaczy, że coś w klasie jest statyczne? Deklaracja dodanie specyfikatora static Użycie dwa przypadki gdy obiekt nie istnieje: NazwaKlasy.NazwaSkładowej gdy obiekt istnieje, tak samo jak dla niestatycznych ze statycznych metod nie wolno odwoływać się do składowych niestatycznych (mogą nie istnieć)
Statyczne składowe klasy Typowy przykład class Punkt { static int ilosc=0; // pole statyczne double x, y; Punkt(double x, double y) { ilosc++; this.x=x; this.y=y; } double odleglosc(Punkt p) { return Math.sqrt((this.x-p.x)*(this.x-p.x) +(this.y-p.y)*(this.y-p.y)); } }
Statyczne składowe klasy Typowy przykład c.d. public class Przyklad4 { public static void main(String[] args) { Punkt[] t = new Punkt[10]; for (int i=0; i<5; i++) { t[i] = new Punkt(i,i); } System.out.println(Punkt.ilosc); System.out.println(t[0].ilosc); } }
Pakiety Kilka uwag pakiety możemy rozpatrywać jako biblioteki klas każda klasa należy do jakiegoś pakietu (nazwanego lub nienazwanego) pakiety są zorganizowane hierarchicznie co daje możliwość organizowania klas w pakiety możemy grupować klasy unikamy konfliktów nazw (np. może być kilka klas Button, List, itp.) nazwy kwalifikowane nazwa_pakietu.nazwa_klasy polecenie import (np. import java.awt.Button)
Pakiety Przykład 1 tworzymy plik przyklad1.java katalog tools plik tools/LZespolona.java
Pakiety Przyklad 1 c.d. zawartość pliku tools/LZespolona.java package tools; public class LZespolona { public double re, im; public LZespolona(double x, double y) { re=x; im=y; } public LZespolona add(LZespolona z) { return new LZespolona(this.re+z.re, this.im+z.im);
Pakiety Przykład 1 c.d. zawartość pliku Przyklad1.java import tools.LZespolona; public class Program01 { static void wypisz(LZespolona z) { System.out.println(z.re+"+"+z.im+"i"); } public static void main(String[] args) { LZespolona z1 = new LZespolona(1,1); LZespolona z2 = new LZespolona(2,3); LZespolona z3 = z1.add(z2); wypisz(z1); wypisz(z2); wypisz(z3);
Ćwiczenie 1 Rozszerzyć klasę ParaLiczb o następujące metody Roznica() Iloraz() Należy przy tym pamiętać, aby nie dopuścić do dzielenia przez 0.
Ćwiczenie 2 Rozszerzyć klasę LZespolona z pakietu tools o operację odejmowania mnożenia liczb zespolonych