Programowanie obiektowe I. Obiekty i klasy Małgorzata Prolejko OBI JA16Z03
Plan Klasy i obiekty Odnośniki (referencje) Używanie klas predefiniowanych Tworzenie własnych klas Relacje pomiędzy klasami: dziedziczenie i asocjacja Dostępność elementów klasy Enkapsulacja Konstruktory Konstruktor bezargumentowy. Konstruktory przeciążone, Wywołanie innego konstruktora Pola i metody Parametry metod Przeciążanie metod Inicjacja pól wartościami domyślnymi Pola i metody statyczne Stałe statyczne Metoda main() Metody fabryczne Niszczenie obiektów Pakiety Importowanie klas. Dodawanie klas do pakietu. Zasięg pakietu Dokumentacja Dokumentacja klas, metod i pól składowych Generowanie dokumentacji. Wskazówki dotyczące projektowania prostych klas
Klasy i obiekty Odnośniki (referencje) klasa definicja, projekt obiektu class Pracownik{ obiekt instancja klasy, zaalokowana pamięć o zdefiniowanej w klasie strukturze p = new Pracownik(); referencja wskaźnik na obiekt obszar pamięci gdzie znajduje się obiekt
Klasy i obiekty Używanie klas predefiniowanych import java.util.date; public class Test1 { public static void main(string[] args){ Date d = new Date(); System.out.println(d.getTime()); Import jednej klasy z pakietu Import pakietu Utworzenie obiektu Wywołanie metody import java.text.simpledateformat; import java.util.*;... Calendar c = new GregorianCalendar(2016,00,01); SimpleDateFormat sdf = new SimpleDateFormat("yyyy MMM dd HH:mm:ss"); System.out.println(sdf.format(c.getTime())); package test1
Klasy i obiekty Ćwiczenie 1. Napisz program wyświetlający na konsoli aktualną datę w formacie dd.mm.yyyy.
Klasy i obiekty Tworzenie własnych klas Definicja klasy powinna zaczynać się od słowa kluczowego public class, a następnie nazwa klasy pisana z wielkiej litery. Taką samą nazwę jak klasa powinien mieć plik.java w której się ona znajduje. public class Nazwa{ pole1; pole2;... konstruktor1 konstruktor2... metoda1 metoda2 W nawiasach klamrowych znajduje się ciało klasy. Kolejność elementów jest dowolna, ale należy przyjąć pewną konwencję i się jej trzymać, aby kod był bardziej czytelny. package test2
Klasy i obiekty Tworzenie własnych klas public class Pracownik{ private String nazwisko; public Pracownik(String n){ nazwisko = n; public String getnazwisko(){ return nazwisko; Pracownik p; p = new Pracownik("Nowak"); System.out.println(p.getNazwisko()); Deklaracja klasy Pole prywatne Konstruktor Metoda publiczna Deklaracja zmiennej Stworzenie obiektu Wywołanie metody package test2
Klasy i obiekty public class Ksiazka{ private String tytul; private String autor; private String issn; public Ksiazka(String t,string a, String i){ tytul = t; autor = a; issn = i; public String gettytul(){ return tytul; public void settytul(string t){ tytul=t; Tworzenie własnych klas public String getautor(){ return autor; public String getissn(){ return issn; package test2
Klasy i obiekty Ćwiczenie 2. Utwórz klasę obsługującą Przedmiot na studiach. Dodaj pola i metody, które uważasz za istotne. Stwórz 2 różne obiekty i wyświetl na ekranie informacje o nich.
Klasy i obiekty Relacje pomiędzy klasami: dziedziczenie i asocjacja Dziedziczenie - powielenie pól i metod klasy bazowej oraz rozszerzenie ich o nowe relacja JEST "Pracownik JEST iem" public class Pracownik extends { Pracownik
Klasy i obiekty Relacje pomiędzy klasami: dziedziczenie i asocjacja Dziedziczenie - powielenie pól i metod klasy bazowej oraz rozszerzenie ich o nowe relacja JEST "Pracownik JEST iem" public class Pracownik extends { Asocjacja - zawieranie w klasie pól będących referencjami do innych obiektów relacja MA (UŻYWA) " MA zarezerwowane książki" public class { private Ksiazka[] rezerwacjeksiazek; Książka
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik public class Pracownik extends { Jeden obiekt JEST RODZAJEM innego. Pracownik JEST RODZAJEM a.
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik public class Pracownik extends {
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Jeden obiekt ZAWIERA inny, który nie może istnieć samodzielnie. ZAWIERA(posiada) Kartę. Karta nie może istnieć bez a.
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta public { private Karta kartabiblioteczna; public (){ kartabiblioteczna = new Karta();
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Telefon Jeden obiekt ZAWIERA inny, który może istnieć samodzielnie. ZAWIERA(posiada) Telefon. Telefon może istnieć bez a.
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Telefon public { private Telefon telefon; public (Telefon t){ telefon = t;
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Telefon Książka Jeden obiekt KORZYSTA z innego niezależnego obiektu. KORZYSTA(wypożycza) Książki. Książki nie zależą od a.
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Telefon Książka public { private List<Książka> wypozyczenia; public void wypozycz(ksiazka k){ wypozyczenia.add(k);
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Telefon Książka Rezerwacja Jeden obiekt JEST ZALEŻNY od innego. JEST ZALEŻNY od(używa obiektu) Rezerwacji.
Klasy i obiekty Relacje pomiędzy klasami: Diagramy UML Dziedziczenie Agregacja całkowita Agregacja częściowa Asocjacja Zależność Pracownik Karta Telefon Książka Rezerwacja public { public void wypozycz(rezerwacja r){...
Klasy i obiekty Ćwiczenie 3. Utwórz klasy na podstawie poniższych diagramów relacji. Biblioteka Katalog Pracownik Student Książka
Klasy i obiekty Modyfikatory dostępu <brak> modyfikator pól, metod i klas domyślny: widoczność klas, metod i pól wewnątrz pakietu Dostępność elementów klasy private public protected modyfikator dla pól i metod prywatnych: widoczność wewnątrz metod danej klasy modyfikator dla pól, metod i klas publicznych: widoczność w dowolnym miejscu kodu modyfikator dla pól i metod chronionych: widoczność wewnątrz pakietu lub w podklasach
Klasy i obiekty Enkapsulacja Zasada enkapsulacji: Dostęp do stanu obiektu można uzyskać jedynie przez wywołanie metod dostęp do pól składowych mają mieć tylko metody danej klasy publiczne mogą być pola statyczne i finalne metody nieprzydatne w operowaniu obiektem powinny być prywatne wspólne pola i metody dwóch klas powinny znaleźć się w nadklasie Enkapsulacja pozwala na modyfikację wewnętrznej implementacji klas bez konieczności modyfikacji kodu wykorzystującego tą klasę. Zapobiega też niekontrolowanemu modyfikowaniu stanu obiektów.
Konstruktory Konstruktor bezargumentowy Konstruktor jest funkcją wywoływaną podczas tworzenia obiektu. Powinna ona ustawiać stan obiektu poprzez inicjację pól składowych. Jeżeli konstruktor nie zostanie zdefiniowany zostanie użyty domyślny konstruktor (bezargumentowy) inicjujący pola wartościami domyślnymi public class Pracownik{ private String nazwisko; public class Pracownik{ private String nazwisko; public Pracownik(){ nazwisko = null;
Konstruktory Konstruktor bezargumentowy Konstruktor jest funkcją wywoływaną podczas tworzenia obiektu. Powinna ona ustawiać stan obiektu poprzez inicjację pól składowych. Jeżeli konstruktor nie zostanie zdefiniowany zostanie użyty domyślny konstruktor (bezargumentowy) inicjujący pola wartościami domyślnymi liczby 0 wartości logiczne false obiekty null
Konstruktory Konstruktory przeciążone Obiekt może posiadać wiele konstruktorów o różnych listach parametrów. Metody posiadające więcej niż jedną implementację (sygnaturę) są przeciążone, a interpreter dobiera odpowiednią do wywołania. public class Pracownik{ private String nazwisko; public Pracownik(){ nazwisko = "<<nienazwany>>"; public Pracownik(String n){ nazwisko = n;... Pracownik p = new Pracownik(); Pracownik k = new Pracownik("A"); package test3
Konstruktory Konstruktory przeciążone Obiekt może posiadać wiele konstruktorów o różnych listach parametrów. Metody posiadające więcej niż jedną implementację (sygnaturę) są przeciążone, a interpreter dobiera odpowiednią do wywołania. Jeżeli nie zostanie zdefiniowany konstruktor bezargumentowy, ale będzie dowolny inny, to nie będzie można stworzyć obiektu za pomocą wywołania bezargumentowego (zniknie konstruktor domyślny). public class Pracownik{ private String nazwisko; public Pracownik(String n){ nazwisko = n; Pracownik p = new Pracownik(); Pracownik k = new Pracownik("A");
Konstruktory Wywołanie innego konstruktora Jeżeli klasa posiada wiele konstruktorów, wygodnie jest wywołać inny konstruktor zamiast powielać inicjowanie pól. public class Pracownik{ private String nazwisko; private String numertel; public Pracownik(String naz){ nazwisko = naz; public Pracownik(String naz,string num){ nazwisko = naz; numer = num;... Identyczna inicjalizacja pól w dwóch konstruktorach package test4
Konstruktory Wywołanie innego konstruktora Jeżeli klasa posiada wiele konstruktorów, wygodnie jest wywołać inny konstruktor zamiast powielać inicjowanie pól. public class Pracownik{ private String nazwisko; private String numertel; public Pracownik(String naz){ nazwisko = naz; public Pracownik(String naz,string num){ this(naz); numertel = num; Wywołanie konstruktora jednoargumentowego package test4
Konstruktory Ćwiczenie 4. Dodaj do swojej klasy Przedmiot wymagane konstruktory.
Pola i metody Parametry metod Parametry przekazywane są przez wartość (a nie referencję), co oznacza, że zmiana wartości parametru w ciele metody nie będzie widoczna na zewnątrz. public class Pracownik{ private String nazwisko; public void setnazwisko(string n){ n = "B"; nazwisko = n; String naz = "A"; Pracownik p = new Pracownik(); p.setnazwisko(naz); System.out.println(p.getNazwisko(), naz); Nadpisanie parametru Przypisanie wartości do pola "B" "A" package test5
Pola i metody Przeciążanie metod Sygnatura opis metody zawierający: typ zwracany, nazwę metody i listę typów parametrów (argumentów) Może być więcej niż jedna implementacja metody o zadanej nazwie. Sygnatura może się różnić jedynie listą typów argumentów, zatem nie można zaimplementować metody o takiej samej nazwie, ale różnym typie zwracanym.
Pola i metody Inicjacja pól wartościami domyślnymi Pola można inicjować wartościami domyślnymi na kilka sposobów: w konstruktorze, w deklaracji pola lub w kodzie klasy public class Pracownik{ private String nazwisko; public Pracownik(){ nazwisko = "";... public class Pracownik{ private String nazwisko = "";... public class Pracownik{ private String nazwisko; {nazwisko = "";... package test6
Pola i metody Pola i metody statyczne Niektóre pola powinny mieć jednakowe wartości dla wszystkich obiektów danej klasy. Takie pole jest statyczne. Pola statyczne przechowywane są w pamięci i są dostępne nawet gdy nie istnieje żaden obiekt. Pola statyczne powinny mieć modyfikator public. public class Pracownik{ private String nazwisko; public static int dlugoscwypozyczenia = 30; Pracownik.dlugoscWypozyczenia = 20; Pracownik p = new Pracownik(); System.out.println(p.dlugoscWypozyczenia); package test7
Pola i metody Pola i metody statyczne Statyczne mogą być również metody wtedy, gdy odwołują się wyłącznie do danych statycznych. Metody statyczne mogą być wywoływane bez konieczności tworzenia obiektu. public class Pracownik{ private String nazwisko; public static int dlugoscwypozyczenia = 30; public static void wydluz(int dw){ dlugoscwypozyczenia = dw * dlugoscwypozyczenia; Pracownik.wydluz(2); Pracownik p = new Pracownik(); System.out.println(p.dlugoscWypozyczenia); package test8
Pola i metody Stałe statyczne Pola statyczne mogą być opatrzone modyfikatorem final. Oznacza to, że wartość tego pola nie może ulec zmianie. Stałe statyczne zwykło się nazywać samymi wielki literami. public class Pracownik{ private String nazwisko; public static final int LICZBA_WYPOZYCZEN = 10; System.out.println(Pracownik.LICZBA_WYPOZYCZEN); public final class Math{ public static final double PI =...... System.out.println(Math.PI);
Pola i metody Ćwiczenie 5. W swojej klasie Przedmiot dodaj modyfikatory pól final tam gdzie powinny być oraz dodaj nowe pola i metody dla tej klasy opatrzone modyfikatorem static.
Metoda Funkcja main() umieszczana jest w pewnej dowolnej klasie jako metoda publiczna i statyczna. Oznacza to, że może zostać wywołana zanim zostanie stworzony jakikolwiek obiekt tej klasy. Uruchomienie programu Program.java polega na wywołaniu z linii poleceń java Program w tym momencie Wirtualna Maszyna wyszukuje metodą main() w klasie Program bez tworzenia jego obiektu. Każda klasa może posiadać tą metodę, dzięki czemu możliwe jest przetestowanie działania samej klasy.
Metoda Ćwiczenie 6. Dodaj metodę main() do klasy Przedmiot. Metoda ta powinna testować działanie konstruktorów oraz metod. Uruchom metodę main z klasy testującej i z klasy Pracownik
Metody fabryczne Statyczne metody, które zwracają obiekt danej klasy nazywają się fabrycznymi. Metody te wywoływane są zamiast konstruktora w celu utworzenia obiektu. int liczba = 100; NumberFormat formator1 = NumberFormat.getCurrencyInstance(); System.out.println(formator1.format(liczba)); NumberFormat formator2 = NumberFormat.getNumberInstance(); System.out.println(formator2.format(liczba)); Dzięki metodom fabrycznym można na różne sposoby tworzyć obiekt lub obiekty klas pochodnych przy tym samym zestawie argumentów. package test9
Metody fabryczne Ćwiczenie 7. Dodaj dwie metody fabryczne do klasy Przedmiot: - jedna stworzy przedmiot egzaminacyjny o zadanej nazwie, automatycznie wygeneruje jego skrót i doda 5 punktów ECTS - druga stworzy przedmiot zaliczeniowy o zadanej nazwie, automatycznie wygeneruje skrót i nada 4 punkty ECTS
Niszczenie obiektów W Javie nie ma zarządzania pamięcią przez programistę/użytkownika. Używany jest GarbageCollector, który oczyszcza pamięć z nieużywanych obiektów, ale nie ma nad nim kontroli. Gdy podczas niszczenia obiektów W klasach można implementować metodę finalize(), w której zapisywane są funkcje wywoływane pod koniec życia obiektów.
Pakiety Korzystanie z obcych klas java.util.date date = new java.util.date(); Importowanie całego pakietu, np. java.util import java.util.* Date date = new Date(); Importowanie jednej klasy z pakietu import java.util.date import java.util.date Importowanie klas
Pakiety plik pl/edu/pw.elka/klasaelkowa.java Dodawanie klas do pakietu package pl.edu.pw.elka public class KlasaElkowa{... plik pl/edu/pw.elka/drugaklasaelkowa.java package pl.edu.pw.elka public class DrugaKlasaElkowa{...
Pakiety Zasięg pakietu Każde dwa pakiety traktowane są rozłączne. Oznacza to, że korzystając z innego niż aktualny pakiet należy załączyć odpowiedni import. Nie ma tu znaczenia zawieranie się podpakietów w pakietach lub wspólne człony nazw.
Pakiety Ćwiczenie 8. Stwórz w projekcie pakiet dla ćwiczeń oraz pakiet dla prac domowych. Dodaj do pakietów dotychczasowe pliki.
Dokumentacja Javadoc Narzędzie do automatycznego generowania dokumentacji na podstawie komentarzy zapisanych w kodzie. Specjalne znaczniki pozwalają na opisywanie klas, pól i metod. /**. */ blok komentarza, który zostanie umieszczony w dokumentacji @... znaczniki opisów szczegółowych umieszczony w komentarzu Metody @param parametry metod @return wartość zwracana @throws wyrzucane wyjątki /lub/ @exception wyrzucane wyjątki Klasy i pola @author autor @version wersja @since wersja
Dokumentacja Znaczniki odniesienia @see "tekst" nie tworzy aktywnego linku @see <a href="url">tekst</a> - tworzy klink htmlowy @see pakiet.klasa#element tekst tworzy link do elementu klasy z pakietu {@link pakiet.klasa#element tekst odnośnik który może występować wewnątrz innego znacznika @deprecated znacznik przestarzałego kodu, w opisie powinno się znaleźć od której wersji i czego należy użyć w zamian
Dokumentacja Dokumentacja klas, metod i pól składowych /** * klasa reprezentujaza pracownika na dowolnym stanowisku * @author Ten Autor * @version 0.1 */ public class Pracownik{ /** * Nazwisko Pracownika w formacie <<Imię, Nazwisko>> */ private String nazwisko; /** * Konstruktor jednoargumentowy * @param n nazwisko w formacie <<Imię, Nazwisko>> */ public Pracownik(String n){ nazwisko = n; /** * Konstruktor dwuargumentowy * @param i - imię * @param n nazwisko */ public Pracownik(String i, String n){ nazwisko = i + ", " + n; package test10
Dokumentacja /** * klasa reprezentujaza pracownika na dowolnym stanowisku * @author Ten Autor * @version 0.1 */ public class Pracownik{ /** * Nazwisko Pracownika w formacie <<Imię, Nazwisko>> /** */ private String nazwisko; /** * Konstruktor jednoargumentowy * @author Ten Autor * @param n nazwisko w formacie <<Imię, Nazwisko>> */ * @version 0.1 public Pracownik(String n){ nazwisko = n; */ /** public class Pracownik * Konstruktor dwuargumentowy * @param i - imię * @param n nazwisko */ public Pracownik(String i, String n){ nazwisko = i + ", " + n; Dokumentacja klas, metod i pól składowych * klasa reprezentująca pracownika na dowolnym stanowisku
Dokumentacja /** * klasa reprezentujaza pracownika na dowolnym stanowisku * @author Ten Autor * @version 0.1 */ public class Pracownik{ /** * Nazwisko Pracownika w formacie <<Imię, Nazwisko>> */ private String nazwisko; /** * Konstruktor jednoargumentowy /** * @param n nazwisko w formacie <<Imię, Nazwisko>> */ public Pracownik(String n){ nazwisko = n; */ /** private * Konstruktor String dwuargumentowy nazwisko; * @param i - imię * @param n nazwisko */ public Pracownik(String i, String n){ nazwisko = i + ", " + n; Dokumentacja klas, metod i pól składowych * Nazwisko Pracownika w formacie <<Imię, Nazwisko>>
Dokumentacja Dokumentacja klas, metod i pól składowych /** * klasa reprezentujaza pracownika na dowolnym stanowisku * @author Ten Autor * @version 0.1 */ public class Pracownik{ /** * Nazwisko Pracownika w formacie <<Imię, Nazwisko>> */ private String nazwisko; /** * Konstruktor jednoargumentowy * @param n nazwisko w formacie <<Imię, Nazwisko>> */ public Pracownik(String n){ nazwisko = n; /** * /** * Konstruktor dwuargumentowy jednoargumentowy * i - imię * * @param n n nazwisko nazwisko w formacie <<Imię, Nazwisko>> */ */ public Pracownik(String i, String n){ nazwisko = i + + n; public Pracownik(String n){
Dokumentacja /** * klasa reprezentujaza pracownika na dowolnym stanowisku * @author Ten Autor * @version 0.1 */ public /** class Pracownik{ /** * * Konstruktor Nazwisko Pracownika dwuargumentowy w formacie <<Imię, Nazwisko>> */ * private @param String nazwisko; i - imię /** * * @param Konstruktor n jednoargumentowy nazwisko * @param n nazwisko w formacie <<Imię, Nazwisko>> */ */ public Pracownik(String n){ nazwisko = n; /** * Konstruktor dwuargumentowy * @param i - imię * @param n nazwisko */ public Pracownik(String i, String n){ nazwisko = i + ", " + n; Dokumentacja klas, metod i pól składowych public Pracownik(String i, String n){
Dokumentacja Generowanie dokumentacji w konsoli: javadoc [opcje] nazwa_pakietu javadoc [opcje] nazwa_pliku.java w Eclipse: Project -> Generate JavaDoc
Dokumentacja Ćwiczenie 9. Dodaj dokumentację do swoich klas. Opisz wszystkie pola, konstruktory i metody. Wygeneruj dokumentację w formie plików html.
Wskazówki Podczas projektowania wybierz rzeczowniki kluczowe dla problemu i utwórz dla nich klasy. W każdej klasie zastanów się jakie operacje będą na niej wykonywane i dodaj odpowiednie metody. W trakcie pracy dodawaj niezbędne pola. Zastanów się nad cechami wspólnymi wszystkich obiektów danej klasy i dodaj pola statyczne. Dodaj gettery i settery dla pól niefinalnych, które mogą być widziane/zmieniane na zewnątrz obiektu.
Praca domowa 1. Zaprojektuj klasy do systemu rezerwacji biletów lotniczych. Zdefiniuj rzeczowniki kluczowe, które będą odzwierciedlane w klasach. Dobierz pola, nadaj im odpowiednie modyfikatory. Dodaj konstruktory. Klasy uzupełnij metodami pozwalającymi na rezerwację biletu. Napisz kod testujący.