w3 java, informatyka, Wykłady Java B.Pańczyk
[ Pobierz całość w formacie PDF ]
Definiowanie klas JAVA Programowanie obiektowe • w klasie określamy właściwości obiektów (dane związane z obiektami) oraz operacje, które na tych obiektach (a więc na zawartych w nich danych) moŜna wykonać • dane są reprezentowane przez pola klasy - są to zmienne lub stałe określonych typów odpowiednio zadeklarowane • operacje wprowadzamy poprzez definicję metod klasy • zestaw metod klasy nazywamy jej interfejsem Beata Pańczyk - Java (Wykład 3) 2 Definicja metody - schemat Definicja klasy - przykład 1 TypWyniku NazwaMetody(lista_parametrów) { class Para{ int a; // to s ą dane zwane polami klasy int b; ... void dodaj(Para p){ ... // instrukcje wykonywane po wywołaniu metody } • lista parametrów zawiera oddzielone przecinkami deklaracje parametrów wejściowych; lista moŜe być pusta • metoda moŜe zwracać wynik typu TypWyniku lub nie zwracać Ŝadnego wyniku (wtedy jej typ wyniku określamy słowem kluczowym void ) //metoda klasy ...} //dodaje pary void pokaz() { //metoda klasy ...} //pokazuje par ę } //koniec definicji klasy Para 3 4 Konstruktor Przykłady konstruktorów • specjalną operacją jest operacja tworzenia obiektu danego typu, czyli nadanie odpowiednich wartości jego polom • sposób tworzenia obiektu określa konstruktor - szczególna metoda klasy, której deklaracja nie ma Ŝ adnego typu wyniku (nawet void) a jej nazwa jest nazw ą klasy class Para{ int a,b; Para(int x,int y) { class Para{ int a,b; Para(int x) { a=x; b=y; a=x; b=x; } ... } ... } } 5 6 1 Tworzenie obiektów Tworzenie obiektów - przykład • obiekty są tworzone wyraŜeniem new poprzez wywołanie konstruktora odpowiedniej klasy • tworzenie obiektu - sposób 1 TypObiektu identyfikator = new NazwaKlasy (argumenty); • tworzenie obiektu - sposób 2 TypObiektu identyfikator; ... identyfikator=new NazwaKlasy(argumenty); • tworzymy dwa obiekty klasy Para Para p1=new Para(1,2); Para p2; p2=new Para(3,4); • obiekty mają postać obiekt p1: obiekt p2: Pola: int a; (=1) Pola: int a; (=3) int b; (=2) int b; (=4) Metody: Metody: void dodaj(...) void dodaj(...) void pokaz(...) void pokaz(...) 7 8 Komunikowanie si ę z obiektami Przykład 1 - pełna definicja klasy class Para { int a, b; // pola klasy /* metody czyli interfejs klasy: */ Para (int x,int y) • identyfikatory pól i metod są takie same dla wszystkich obiektów danej klasy zatem naleŜy wskazać o który obiekt nam chodzi // konstruktor klasy { a=x; b=y; p1.a; //odwołanie do pola a obiektu p1 (=1) p2.a; //odwołanie do pola a obiektu p2 (=3) p1.pokaz();// obiektowi p1 wysyłamy komunikat // pokaz() (poka Ŝ si ę ) czyli wywołujemy // metod ę pokaz() dla obiektu p1 // pokazuje (1,2) p2.pokaz();//poka Ŝ obiekt p2 //pokazuje (3,4) } void dodaj(Para p) // dodaje pary { a=a+p.a; b=b+p.b; } void pokaz() // pokazuje par ę { System.out.println(" (" + a + ", " + b + " ) " ); } } // koniec definicji klasy 9 10 Przykład 1- zastosowanie klasy Para Słowo kluczowe this class AppPara { • w poniŜszym przykładzie nazwy parametrów a i b metody dodaj są takie same (przesłaniają) nazwy pól klasy class Para { int a,b; ... void dodaj(int a, int b){ ... } public static void main(String [ ] args) { Para p1=new Para(10,20); Para p2=new Para(1,2); p1.pokaz(); // wypisze (10, 20 ) } • metodę dodaj naleŜy zdefiniować void dodaj(int a, int b) { this.a+=a; this.b+=b; } oznacza to, Ŝe do pól TEGO (this) obiektu (na rzecz którego wywołano metodę) naleŜy dodać odpowiednio wartości argumentów a i b p2.pokaz(); // wypisze (1, 2 ) p1.dodaj(p2); p1.pokaz(); // wypisze ( 11, 22 ) } } 11 12 2 Słowo kluczowe this Statyczne składowe klasy • jeśli metoda musi zwrócić ten obiekt na rzecz którego została wywołana to równieŜ konieczne jest zastosowanie słowa this Para dodaj(Para p) { a+=p.a; b+=p.b; return this; //zwraca ten obiekt na rzecz, //którego wołano metod ę dodaj • pola i metody klasy mogą być statyczne i nie statyczne; nie statyczne wiąŜą się z istnieniem obiektu danej klasy • składowe statyczne (pola i metody) są deklarowane przy uŜyciu specyfikatora static i mogą być uŜywane nawet gdy nie istnieje Ŝaden obiekt klasy • ze statycznych metod nie wolno odwoływać się do nie statycznych składowych klasy (obiekt moŜe nie istnieć) } • po takiej definicji metody moŜna (po utworzeniu obiektów p, p1, p2, p3) napisać p.dodaj(p1).dodaj(p2).dodaj(p3); //z lewej do prawej //równowa Ŝ ne z p.dodaj(p1); p.dodaj(p2); p.dodaj(p3); 13 14 Składowe statyczne - przykład Składowe statyczne - przykład • dodajemy do klasy Para pole zliczające ile razy były tworzone obiekty Para; nie powinno ono naleŜeć do Ŝadnego obiektu - liczba utworzonych par jest właściwością samej klasy class Para { static int licz = 0; // pole statyczne int a, b; Para (int x, int y) { licz++; a = x; b = y; } static void pokaz_licz( ) { //metoda statyczna System.out.println("Liczba utworzonych par"+licz); Para p1=null, // inicjalizacja odniesieniem pustym p2=null; // p1 i p2 nie odnosz ą si ę do Ŝ adnego obiektu if (Para.licz == 0) Para p1=new Para(1, 1); else while (Para.licz<10) { p2=new Para(2,2); p1.dodaj(p2); } System.out.println(p1.licz); Para.pokaz_licz(); //wywołanie metody statycznej p1.pokaz_licz(); p2.pokaz_licz(); } ... } 15 16 Pole statyczne klasy System • W klasie System pakietu java.lang zadeklarowano statyczne pole typu PrintStream (obiekt klasy PrintStream związany ze standardowym wyjściem) public class System{ ... public static PrintStream out; ... } • w klasie PrintStream pakietu java.io zdefiniowano metodę println , wypisującą wiersz podany jako argument public class PrintStream{ ... public void println(String s) { ... } ... } • System.out - statyczne pole o ident. out (obiekt klasy PrintStream), println(...) - uŜycie metody na rzecz tego obiektu - razem otrzymujemy System.out.println(...) Specyfikatory dost ę pu KaŜda składowa klasy moŜe być: • private - prywatna, dostępna tylko w danej klasie • protected - chroniona lub zabezpieczona, dostępna z danej klasy i wszystkich klas ją dziedziczących • public - publiczna, dostępna zewsząd • zaprzyjaźniona, nie poprzedzona Ŝadnym specyfikatorem, dostępna ze wszystkich klas danego pakietu (tzw. dostęp pakietowy lub domyślny) KaŜda klasa moŜe być: • public - publiczna, dostępna zewsząd (z innych pakietów) • pakietowa, dostępna tylko z klas pakietu 17 18 3 Specyfikatory dost ę pu - przykład class Para { private int a; private int b; private void ustalA(int x) { a = x ;} private void ustalB(int y) { b = y ;} void ustalAB(int a, int b) { ustalA(a); ustalB(b); } Inicjalizacja pól Przy tworzeniu obiektu: • pola klasy mają zagwarantowaną inicjalizację na wartości ZERO (tzn. 0 – dla liczb, '\0' – dla łańcuchów, false - dla typu boolean, null - dla typów obiektowych) • zwykle w konstruktorze dokonuje się reinicjalizacji pól • moŜna równieŜ posłuŜyć się jawną inicjalizacją przy deklaracji pól } class Test1{ public static void main(String [ ] args) { Para p=new Para(); p.a=1; // bł ą d: niedost ę pne pole p.ustalA(1); // bł ą d: niedost ę pna metoda p.ustalAB(20,21); // OK } } 19 20 Inicjalizacja pól - przykład class Para { static String text=" Pary "; //inicjalizacja static int x=-1; int a=x+1; //w inicjalizacji moŜna korzystać z wyraŜeń int b=x+1; // i wywołania metod Para( ) { a++; b++; } void pokaz( ) { System.out.println("( "+a+","+b+" )"); } Inicjalizacja pól - reguły • kaŜde odwołanie do klasy inicjalizuje najpierw pola statyczne • tworzenie obiektu (new) inicjalizuje pola nie statyczne, po czym wykonywany jest konstruktor • kolejność inicjalizacji pól - według ich kolejności w definicji klasy (najpierw statyczne) • zmienne lokalne (zmienne pomocnicze metody, parametry metody) nie mają zagwarantowanej inicjalizacji } class Test2{ public static void main (String [ ] arg) { Para p=new Para(); p.pokaz(); //wyprowadzi (1 ,1 ) } } 21 22 Inicjalizacja pól - przykład Przeci ąŜ anie metod • przeciąŜanie metod - moŜliwość definicji w jednej klasie metod o tej samej nazwie, ale róŜniących się liczbą i/lub typami argumentów • dzięki przeciąŜaniu moŜemy w klasie Para (o polach a i b) zdefiniować metody: void dodaj ( Para p ) { a+=p.a; b+=p.b; } void dodaj ( int i ) { a+=i; b+=i; } void dodaj ( int i, int k ) { a+=i; b+=k; } i wykorzystać je na przykład następująco: Para p=new Para(11,12), p2=new Para(10,20); p.dodaj(3); //wybierana jest ta metoda, p.dodaj(1, 2); //która pasuje najlepiej do argumentów p.dodaj(p2); class Para { static String text="Pary"; int a=x+1; int b=x+1; Para( ) { ... } ... static int x=-1; } • uŜycie x+1 w inicjalizacji a i b było dopuszczalne gdyŜ pole x jest statyczne i mimo iŜ w definicji klasy występuje później, to jego wartość jest juŜ ustalona 23 24 4 Przeci ąŜ anie konstruktorów Przeci ąŜ anie konstruktorów -przykład • przeciąŜanie konstruktorów daje moŜliwość określania ró Ŝ nych sposobów budowy obiektów • jeśli klasa nie ma jawnie zdefiniowanego konstruktora to do definicji klasy automatycznie dodawany jest konstruktor domyślny, bezparametrowy a niestatyczne pola klasy są inicjalizowane według podanych w ich deklaracjach inicjalizatorów lub wartościami ZERO (0, false, null) • jeśli zdefiniowaliśmy jakikolwiek konstruktor to konstruktor bezparametrowy nie jest juŜ automatycznie dodawany i musimy go sami zdefiniować class Para{ ... Para() //konstruktor bezparametrowy { x=-1; y=-1; } Para( int x) // pola inicjalizowane t ą sam ą liczb ą { a=x; b=x; } Para (int x, int y) // pola inicjalizowane innymi liczbami { a=x; b=y; } ... } 25 26 Konstrukcja this Ponowne wykorzystanie klas • koncepcja ponownego wykorzystania klas polega na uŜyciu gotowych fragmentów oprogramowania (klas) do budowy innych klas • gotowe klasy moŜemy wykorzystać na dwa sposoby: poprzez kompozycj ę i poprzez dziedziczenie class Para { int a,b; Para (int x, int y) {a=x; b=y; } void dodaj(Para p) { a+=p.a; b+=p.b } void pokaz( ) { System.out.println(" (" + a + ", " + b + " ) " ); } • konstruktor moŜe być wywołany z innego konstruktora za pomocą konstrukcji this(lista_argumentów); (musi to być pierwsza instrukcja w ciele konstruktora): • na przykład: Para ( ) { this(1); } Para (int x) { this(x,x); } Para (int x, int y) { a=x; b=y; } } 27 28 Kompozycja - przykład Kompozycja - przykład class ParaKomp { String nazwa; // obiekt String zawarty w obiekcie ParaKomp Para p; //obiekt Para zawarty w obiekcie ParaKomp ParaKomp( String s, int x, int y) { //konstruktor nazwa=s; p=new Para(x,y); //tworzenie obiektu Para • po zdefiniowaniu klasy ParaKomp obiekty i metody tej klasy moŜna wykorzystać w innej klasie: ParaKomp pk1 = new ParaKomp("Ak",10,20); ParaKomp pk2 = new ParaKomp("Bk",11,21); pk1.pokaz ( ); pk1.dodaj (pk2 ); pk1.pokaz ( ); } void dodaj ( ParaKomp pk ) { p.dodaj ( pk.p ) } void pokaz ( ) { System.out.println( nazwa ); p.pokaz ( ); } } 29 30 5 [ Pobierz całość w formacie PDF ] |