Pakiety w Javie Łukasz Smyczyński (132834) Czym są pakiety? • Klasy w Javie są grupowane w pewne zbiory zwane pakietami. • Pakiety są więc pewnym podzbiorem biblioteki, zawierają klasy powiązane tematycznie. • Pakiety mogą także zawierać definicje interfejsów. Czym są pakiety? • Pakiety umożliwiają oddzielenie naszego kodu od kodu bibliotek napisanych przez innych programistów. • Głównym powodem stosowania pakietów jest gwarancja unikalności nazw klas. • Wraz z JDK otrzymujemy dość pokaźną liczbę pakietów, zawierających w sumie kilka tysięcy klas. Przegląd standardowych pakietów Java posiada bogatą biblioteką standardowych pakietów, i tak do podstawowych należą: •java.lang: pakiet zawierający wszystkie podstawowe klasy Javy. Nie musi być jawnie importowany, ponieważ kompilator czyni to w sposób automatyczny. •java.io: klasy implementujące operacje wejścia/wyjścia. •java.util: pomocnicze klasy użytkowe (np. generacja liczb losowych, operacje na ciągach znaków, itp.) Przegląd standardowych pakietów Java posiada bogatą biblioteką standardowych pakietów, i tak do podstawowych należą: •java.net: zawiera klasy konieczne do tworzenia oprogramowania wykorzystującego sieć. Wraz z pakietem "java.io" umożliwia dostęp do sieci w celu ładowania lub wysyłania plików. •java.awt: klasy służące do tworzenia graficznego interfejsu użytkownika (GUI). •java.applet: pakiet zawierający klasy używane podczas tworzenia apletów. Plik źródłowy w Javie Ogólna postać pliku źródłowego Javy wygląda następująco: • pojedyncza instrukcja package (opcjonalna) • dowolna liczba instrukcji import (opcjonalne) • pojedyncza deklaracja klasy publicznej (wymagana) • dowolna liczba klas prywatnych (opcjonalna) Tworzenie pakietów • Na samym początku pliku źródłowego Javy może znajdować się instrukcja package, informująca kompilator o nazwie pakietu, do którego mają należeć wszystkie zdefiniowane klasy. • Pominięcie instrukcji package powoduje, że klasy z danego pliku są umieszczane w pakiecie domyślnym, nie posiadającym nazwy. • Użyta instrukcja package musi stanowić w pliku pierwszy element nie będący komentarzem Instrukcja package • Ogólna postać instrukcji package wygląda następująco: package nazwapakietu; • A więc jeśli instrukcja pakietu umieszczona jako pierwsza komenda pliku źródłowego, np. package mojpakiet; to: • Wszystkie klasy w pliku należą do pakietu mojpakiet. • Inne pliki mogą również posiadać tą instrukcję: pakiet rozkłada się bowiem na wiele plików. • Wszystkie pliki .java są zapisywane w katalogu mojpakiet. Hierarchia pakietów • Można również tworzyć strukturę hierarchiczną pakietów, oddzielając ich nazwy za pomocą kropki. package pakiet1.pakiet2.pakiet3 • Struktura pakietów musi być skorelowana ze strukturą katalogów na dysku, a więc pliki zachowywane są w katalogu pakiet1\pakiet2\pakiet3 system Windows pakiet1/pakiet2/pakiet3 system Linux • Należy pamiętać o tym, że w Javie rozróżniane są małe i duże litery, zarówno w nazwach klas, jak i w nazwach plików i katalogów. Zmienna CLASSPATH • Istnieje możliwość umieszczania pakietów w różnych miejscach, o ile tylko ich struktura pokrywa się ze strukturą katalogów na dysku. Trzeba jednak również zmodyfikować zmienną środowiskową CLASSPATH, aby wskazywała ona na początek struktury, w której będziemy zapisywać nasze programy. • Np. jeżeli nasz plik zawierający definicję pakietu mojpakiet znajduje się w C:\MyJava\mojpakiet to zmienna CLASSPATH powinna mieć wartość . ; C:\MyJava • Kropka w powyższym zapisie oznacza katalog roboczy. • Java poszukuje pakietów przeszukując kolejne katalogi wymienione w ścieżce CLASSPATH. Pakiety: przykład package mojpakiet; public class StanKonta { String nazwa; double stankonta; public StanKonta (String n, double s) { nazwa = n; stankonta = s; } public void pokaz() { if (stankonta < 0) System.out.println (nazwa + ": " + stankonta + " zl"); } } Pakiety: przykład package mojpakiet; class Pakiet { public static void main (String[ ] args) { StanKonta biezacy [ ] = new StanKonta [6]; biezacy [0] = new StanKonta ("T.Bialy" , 132.12 ); biezacy [1] = new StanKonta ("J.Schmidt" , -56.12 ); biezacy [2] = new StanKonta ("A.Moraw" , 34.75 ); biezacy [3] = new StanKonta ("K.Milski" , -46.95 ); biezacy [4] = new StanKonta ("L.Podly" , -134.14 ); biezacy [5] = new StanKonta ("A.Bakow" , 14.75 ); for (int i=0 ; i<6 ; i++) biezacy[ i ].pokaz ( ); } } J.Schmidt: -56.12 zl K.Milski: -46.95 zl L.Podly: -134.14 zl Jak nazywać pakiety? • Nazwy pakietów skonstruowane są podobnie jak ścieżki dostępu do plików. Na przykład klasa Date znajdująca się w pakiecie java.util ma pełną nazwę: java.util.Date, co oznacza: - java - pakiet należy do zestawu standardowych pakietów Javy - util - to różnego typu klasy użytkowe (pomocnicze) - Date - konkretna nazwa klasy. • Firma Sun zaleca, by w nazewnictwie klas niestandardowych przed właściwą nazwą pakietu stosować odwróconą nazwę domeny internetowej autora pakietu. Np. pl.wroc.pwr.kmeif.mylibrary (odwrócona kolejność!) • Dzięki takiemu systemowi nazwy klas są niepowtarzalne, co pozwala uniknąć niejednoznaczności. Korzystanie z pakietów • Klasa może używać wszystkich klas ze swojego pakietu oraz wszystkich klas publicznych należących do innych pakietów. • Istnieją dwa sposoby dostępu do klasy publicznej innego pakietu: 1) Możemy dołączyć pełną nazwę pakietu na początku każdej nazwy klasy, na przykład: java.util.Date dzisiaj = new java.util.Date(); Jest to jednak bardzo niepraktyczny sposób. 2) Możemy zaimportować konkretną klasę albo cały pakiet korzystając ze słowa kluczowego import. Importowanie pakietów • Słowo kluczowe import umożliwia bezpośrednie odwołanie się do klasy przez jej nazwę. • Możemy zaimportować cały pakiet albo konkretną klasę. Umieszczamy w tym celu słowo import na początku pliku źródłowego (ale pod słowem package), na przykład: import java.util.*; - cały pakiet java.util import java.util.Date; - konkretna klasa • Nie trzeba importować pakietu java.lang , gdyż kompilator dołącza go automatycznie. • Po zaimportowaniu możemy już używać Date dzisiaj = new Date(); Konflikty nazw • Jeśli klasa o tej samej nazwie występuje w dwóch różnych importowanych do programu pakietach (np.klasa Date w poniższych pakietach): import java.util.*; import java.sql.*; to jeżeli użyjemy teraz klasy Date, otrzymamy błąd kompilacji, gdyż procesor nie potrafi określić której klasy Date chcemy użyć. • Można rozwiązać ten problem stosując jeszcze jedno polecenie import java.util.Date; lub przez użycie pełnej nazwy pakietu, na przykład Java.util.Date termin = new java.util.Date(); Importowanie klas: przykład package mojpakiet; public class StanKonta { String nazwa; double stankonta; public StanKonta (String n, double s) { nazwa = n; stankonta = s; } public void pokaz() { if (stankonta < 0) System.out.println (nazwa + ": " + stankonta + " zl"); } } Importowanie klas: przykład import mojpakiet.*; public class Imporotwanie { public static void main ( String args[] ) { StanKonta test = new StanKonta ("T.Biały",-12.57); test.pokaz( ); } } T.Biały: -12.57 zl Literatura • Patrick Naughton „Podręcznik języka programowania Java” • Bruce Eckel – „Thinking in Java” Koniec Dziękuję za uwagę.