Programowanie obiektowe Andrzej Ziółkowski Wykład 3 Pakiety Pakiet – zbiór powiązanych ze sobą klas. Potrzeba wprowadzenia pakietów w języku Java Wprowadzenie uporządkowania i hierarchii klas w dużych projektach Rozwiązanie problemu powtarzających się nazw klas Dystrubucja, pakiety od różnych producentów Struktura pliku definiującego klasę Deklaracja przynależności do pakietu Deklaracja użycia innych pakietów opcjonalna, przykład: import nazwaPakietu1.nazwaPakietu2.nazwaKlasy1; import nazwaPakietu1.nazwaPakietu3.*; Deklaracja klasy publicznej opcjonalna, przykłąd: pakage nazwaPakietu1.nazwaPakietu2; obowiązkowa, przykład: public class nazwaKlasy {…} Deklaracja klas prywatnych opcjonalna, przykład: private class nazwaKlasy {…{ Pakiety standardowe (http://java.sun.com/javase/reference/api.jsp) java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom java.awt.im java.awt.im.spi java.awt.image java.awt.image.renderable java.awt.print java.beans java.beans.beancontext java.io java.lang java.lang.annotation java.lang.instrument java.lang.management java.lang.ref java.lang.reflect java.math java.net java.nio java.nio.channels java.nio.channels.spi java.nio.charset java.nio.charset.spi java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server java.security java.security.acl java.security.cert java.security.interfaces java.security.spec java.sql java.text java.text.spi java.util java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip Pakiety standardowe - dokumentacja Pakiety standardowe - dokumentacja Modyfikatory Słowa kluczowe występujące przed deklaracjami klas, pól i metod określające zakres widzialności elementu lub uściślające sposób działania. Wszystkie modyfikatory są opcjonalne. Pozwalają kontrolować (ograniczyć lub zwiększyć) zakres widzialności różnych elementów (hermetyzacja) dzięki czemu można uniknąć wielu błędów. Modyfikatory dostępu private – element widoczny tylko w klasie, w której został zadeklarowany protected – jak wyżej oraz we wszystkich podklasach --- (bez modyfikatora) – widoczny we wszystkich klasach pakietu, w którym został zadeklarowany public – widoczny wszędzie, również w klasach z innych pakietów Modyfikatory określające cechy static – można używać bez tworzenia egzemplarza obiektu np. nazwaKlasy.mazwaMetody(); final – nie mogą być zmienne pola – we wszystkich obiektach mają taką samą wartość metody – działają dokładnie tak samo dla każdego egzemplarza obiektu, mogą korzystać tylko z pól statycznych pola – stałe wartości określane w momencie deklaracji metody – nie mogą być zmieniane w klasach wywiedzionych z klasy gdzie zostały zadeklarowane klasy – nie mogą być rozszerzane przez dziedziczenie abstract – implementacja w klasie wywiedzionej Modyfikatory - przykład public class klasaA { private int local1; public int global1; public static int vat1; public final int vat2=22; … } public class klasaB { … void Create() { klasaA.vat1 = 22; klasaA.global1 = 0; klasaA a = new klasaA(); a.local1 = 10; a.global1 = 50; a.vat2 = 7; } // poprawne // błąd, najpierw trzeba utworzyć obiekt tej klasy // błąd, local1 jest niewidoczne w klasie B // poprawne // błąd, nie można zmienić wartości vat2 Interfejsy Interfejs – wydzielona część deklaracji klasy bez implementacji Tworząc oprogramowanie określamy dokładnie w jaki sposób klasy będą się między sobą komunikowały. Jedna klasa implementuje interfejs tzn. musi zawierać wszystkie metody z dokładnie takimi samymi parametrami jak zadeklarowane w interfejsie. Druga klasa korzysta jedynie z metod określonych w interfejsie Interfejs - przykład Class Plik { … void Otwórz() {…} void Długość() {…} void Dodaj(int id,string tekst) {…} void Usuń(int id) {…} Void Zamknij() {…} … } Deklarowanie interfejsu interface NazwaInterfejsu { final typ nazwaPola1; … final typ nazwaPolaN;’ typ nazwaMetody1(typ parametr1,…); … typ nazwaMetodyN(typ parametr1,…); } Interfejs jako typ parametru interface Rekord { void Dodaj(int id, string tekst); void Usuń(int id); } Class Plik1 implements Rekord { … void Dodaj(int id,string tekst) {…} void Usuń(int id) {…} } … void Dopisz(Rekord rek, int id, string tekst) { … rek.Dodaj(id,tekst); … } Wykorzystanie interfejsu do deklarowania stałych symbolicznych interface Dzień { final string Pon = „Poniedziałek”; final string Wt = „Wtorek”; final string Śr = „Środa”; final string Czw = „Czwartek”; final string P = „Piątek”; final string Sob = „Sobota”; final string N = „Niedziela”; } Użycie: string dzień = Dzień.Wt; package magazyn; public class Magazyn { protected String[] nazwyTowarów; protected int[] ilościTowarów; protected int[] ilościZamówione; /** Creates a new instance of magazyn */ public Magazyn() { } public void WczytajStan() { // wpisz dane do testowania zamiast wczytania z pliku lub bazy danych nazwyTowarów = new String[] {"Motorola RAZR V3","NOKIA 6131","Sony Ericsson K510i", "Samsung SGH-X160","Alcatel OT C550"}; ilościTowarów = new int[] {20,57,31,38,125}; ilościZamówione = new int[] {0,5,0,8,0}; } public String Nazwa(int n) { if (n < nazwyTowarów.length) return nazwyTowarów[n]; else return null; } public int Ilość(int n) { if (n < nazwyTowarów.length) return ilościTowarów[n]; else return 0; } } private void butZamówMouseClicked(java.awt.event.MouseEvent evt) { javax.swing.DefaultComboBoxModel model = new javax.swing.DefaultComboBoxModel(magazyn.nazwyTowarów); cbNazwaTowaru.setModel(model); textIlość.setText("0"); dlgZamów.setVisible(true); int i = cbNazwaTowaru.getSelectedIndex(); String s = textIlość.getText(); int v = Integer.valueOf(s).intValue(); magazyn.ilościZamówione[i] += v; } private void butStanMagazynuMouseClicked(java.awt.event.MouseEvent evt) { javax.swing.DefaultListModel model1 = new javax.swing.DefaultListModel(); for (int i=0; i < magazyn.nazwyTowarów.length; i++) model1.addElement(magazyn.nazwyTowarów[i]); listaTowarów.setModel(model1); javax.swing.DefaultListModel model2 = new javax.swing.DefaultListModel(); for (int i=0; i < magazyn.ilościTowarów.length; i++) model2.addElement(magazyn.ilościTowarów[i]); listaIlości.setModel(model2); dlgStanMagazynu.setVisible(true); }