Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019
Klasa zbiór pól i metod Obiekt instancja klasy W języku Java wyróżniamy 4 modyfikatory widoczności, definiujące, z jakiego poziomu możemy otrzymać dostęp do składowych klasy: Private dostęp prywatny, dostęp tylko z tej samej klasy Public dostęp publiczny, dostęp z dowolnego miejsca programu Protected dostęp chroniony, dostęp z tej samej klasy, pod-klas (klas dziedziczących) oraz klas z tego samego pakietu Dostęp domyślny, brak modyfikatora (pakietowy) dostęp ze wszystkich klas tego samego pakietu. Uwaga! W przypadku klas, można skorzystać jedynie z modyfikatorów Public oraz pakietowego. Pozostałe 2 modyfikatory dostępne są jedynie dla pól i metod. Modyfikator Klasa Metoda Pole Public X X X Private X X Protected X X Pakietowy X X X Zadeklarowanie klasy jako publicznej nie oznacza, iż wszystkie jej pola i metody muszą być publiczne. Część z nich może posiadać inne modyfikatory. Ogólną strukturę klasy przedstawiono poniżej: public class myfirstclass { // miejsce na pola // miejsce na metody 2
W powyższym przykładzie nie zawarto funkcji public static void main(string[] args) Nie jest ona potrzebna, ponieważ klasa ta ma służyć do dostarczania pól i metod, pozwalających na przetwarzanie danych. W przypadku konieczności wykorzystania określonych danych w programie więcej niż raz, warto rozważyć możliwość utworzenia stałej. Przygotujmy klasę Constants, w której zawrzemy przykładowe stałe. public class Constants { public static final String MOJ_KIERUNEK = "Informatyka"; Dzięki takiej konstrukcji, do stałej MOJ_KIERUNEK, można dostać się z każdego miejsca w programie. Warto zauważyć, iż w deklaracji pojawia się słowo kluczowe final. Znaczenie tego słowa jest różne, w zależności od tego, czy jest używane w kontekście klasy, zmiennej czy metody. Kontekst Klasa Metoda Zmienna Znaczenie Blokada przed dziedziczeniem w programowaniu obiektowym. Klasy oznaczone jako finalne nie mogą służyć jako podstawa do dziedziczenia przez inne klasy. Blokada przed przesłonięciem metody w klasie potomnej. Blokada przed modyfikacją zmiennej (zmienna staje się stałą). Konstruktor to metoda, która odpowiada za tworzenie obiektu. Wywołujemy ją w kodzie w sposób następujący: mojaklasa nazwaobiektu = new mojaklasa(); W podanym przykładzie konstruktor jest konstruktorem domyślnym, który nie posiada parametrów. Wywołanie takiego konstruktora spowoduje, iż utworzony zostanie obiekt, posiadający pola o wartościach domyślnych (0; 0.00; null itd.). Możemy napisać jednak swój własny konstruktor, który pozwoli na utworzenie obiektu o określonych wartościach pól. Utwórzmy klasę Programmer: public class Programmer { String name; String surname; String technology; int age; int experience; double salary; char sex; 3
Wywołanie konstruktora domyślnego, spowoduje utworzenie obiektu o następujących parametrach: Obiekt p został utworzony w sposób następujący: Programmer p = new Programmer(); Zauważmy, że pola w obiekcie przyjęły wartości domyślne, ponieważ konstruktor nie posiadał informacji o sposobie ich inicjalizacji. Napiszmy konstruktor z parametrami, który pozwoli na inicjalizację pól określonymi wartościami. public Programmer (String pname, String psurname, String ptechnology, int page, int pexperience, double psalary, char psex){ name = pname; surname = psurname; technology = ptechnology; age = page; experience = pexperience; salary = psalary; sex = psex; Wywołajmy konstruktor wraz z parametrami: Programmer p2 = new Programmer("Gregory", "House", "Java", 45, 15, 3000.00, 'M'); 4
Jak widać na rysunku, wywołanie konstruktora z parametrami, skutkuje utworzeniem obiektu, zawierającego pola o określonych wartościach. Napisany konstruktor posiada jednak pewną niedoskonałość. Ponieważ w klasie znajduje się 7 pól, konieczne było wymyślenie nazwa dla aż 7 parametrów konstruktora. Spróbujmy napisać go raz jeszcze, bez konieczności długiego zastanawiania się nad nazwami parametrów. public Programmer (String name, String surname, String technology, int age, int experience, double salary, char sex){ this.name = name; this.surname = surname; this.technology = technology; this.age = age; this.experience = experience; this.salary = salary; this.sex = sex; Zauważmy, że w tym przypadku nie pojawiają się nowe nazwy parametrów. Wykorzystano nazwy pól. Takie działanie umożliwia słowo kluczowe this. Słowo kluczowe this umieszczone w metodzie (w tym przypadku konstruktorze) powoduje odniesienie do OBIEKTU, który WYWOŁAŁ metodę. Powyższe linie kodu można tłumaczyć jako: podczas tworzenia obiektu, do pola name podstaw wartość, przekazaną jako parametr name w czasie wywołania konstruktora. Skorzystajmy z naszego nowego konstruktora: 5
Programmer p3 = new Programmer("Sherlock", "Holmes", "JSF", 45, 18, 3200.00, 'M'); Jak widać, pomimo zmian w strukturze konstruktora, jego działanie jest identyczne. UWAGA! W klasie nie mogą znaleźć się 2 konstruktory o identycznych parametrach spowoduje to wyświetlenie błędu. Po dodaniu konstruktora z parametrami, konieczne jest również napisanie konstruktora bezparametrowego (w przypadku chęci dalszego korzystania z konstruktora bezparametrowego). Utwórz pakiet helpers_package, w którym umieścisz klasy Helpers. Napisz klasę ArithmeticHelper, w której zaimplementujesz metody: Dodawanie 2 liczb typu int (metoda powinna przyjąć 2 liczby jako parametry) Odejmowanie 2 liczb typu int (metoda powinna przyjąć 2 liczby jako parametry) Mnożenie 2 liczb typu int (metoda powinna przyjąć 2 liczby jako parametry) Dzielenie 2 liczb typu int (metoda powinna przyjąć 2 liczby jako parametry) Wyszukiwanie największej wartości w tablicy liczb n x n x n Wyszukiwanie najmniejszej wartości w tablicy liczb n x n x n Zmodyfikuje metody tak, by przyjmowały zmienną liczbę argumentów (operator ) 6
Napisz klasę StringOperationHelper, w której zaimplementujesz metody: Wyświetlanie długości zadanego ciągu Usuwanie wybranych znaków w ciągu (ciąg oraz znak do usunięcia powinny zostać przekazane w parametrze) Zamianę w podanym ciągu określonych znaków (jako parametry funkcja powinna przyjąć ciąg znaków, znak do zmiany oraz znak, na który należy dokonać zmiany) Tworzenie tablicy z podanego ciągu. Podziału należy dokonać na podstawie określonego znaku (przekazanego w parametrze). Metoda powinna umożliwiać wykorzystanie kropki jako znaku, według którego nastąpi podział. Porównywanie 2 ciągów znakowych. Metoda powinna zwracać komunikat informujący relacji pomiędzy ciągami. Na poziomie funkcji lub jej wywołania należy zaimplementować wyświetlanie ciągów. Obliczanie wystąpień określonego znaku w ciągu. Metoda powinna być typu int oraz przyjmować ciąg i znak jako parametry. Znajdowanie znaku, który występuje w ciągu najczęściej. Metoda powinna zwracać obiekt, zawierający 2 pola znak oraz ilość wystąpień. Napisz klasę ArrayOperationHelper, w której zaimplementujesz metody: Tworzenie tablicy dwuwymiarowej o wymiarach podanych przez użytkownika (n x m) oraz wypełnianie jej losowymi liczbami z zakresu 0 y (wartość podana przez użytkownika) Tworzenie tablicy dwuwymiarowej o wymiarach podanych przez użytkownika (n x m) oraz wypełnianie jej losowymi liczbami z zakresu podanego przez użytkownika (liczby całkowite). Wyszukiwanie najdłuższego / najkrótszego elementu w tablicy String oraz ich pozycji. Określanie liczby elementów w tablicy dwu wymiarowej liczb całkowitych mniejszej / większej od liczby zadanej przez użytkownika. Wyświetlanie w formie kolumn tablicy liczb całkowitych o wymiarach n x n, dla 100 znajdującego się w zakresie od 0 do 100. Zadbaj o poprawne formatowanie oraz zachowanie odstępuje pomiędzy kolumnami. Przygotuję klasę myarray, zawierającą 3 pola: długość tablicy, długość najdłuższego elementu oraz najdłuższe element. W klasie ArrayOperationHelper napisz metodę, która zwróci obiekt klasy myarray z podstawionymi wartościami. W głównej klasie programu 7
napisz metodę, która wyświetli wynik dla zadanej tablicy (wywołanie metody z klasy ArrayOperationHelper powinno wystąpić w metodzie głównej klasy programu). Napisz klasę CurrencyHelper, w której zaimplementujesz metody: Obliczanie kwoty wraz z podatkiem VAT dla towarów (wykorzystanie stałych) Obliczanie kwoty wraz z podatkiem VAT dla usług (wykorzystanie stałych) Przelicznik walut (jako parametry wprowadzamy kwotę oraz nazwy 2 walut). Wskazówka: do zapisu kwot, należy wykorzystać typ double. 8