Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018
Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy Tworzenie obiektów klasy Konstruktor klasy Elementy statyczne klasy
Złożone typy danych Java pozwala na definiowanie nowych typów danych przez programistę Złożony typ danych jest budowany jako struktura na bazie innych typów danych Mogą być proste lub również złożone Przykłady (już znanych) złożonych typów danych: String (ciąg znaków) Tablica (uporządkowany zbiór danych dowolnego typu)
Przykład złożonego typu danych Marka Pojemność silnika Samochód Kolor Spalanie Liczba miejsc Struktura danych w programie
Klasa Klasa złożony typ danych definiowany w programie przez użytkownika class Samochód() { String marka; double pojemnośćsilnika; Color kolor; float spalanie; int liczbamiejsc; }
Definicja klasy Każda klasa powinna być definiowana w osobnym pliku Wyjątek: klasy wewnętrzne (p. dalej) Nazwa pliku = nazwa klasy +.java class Samochód { } Samochód.java class Motocykl { class Silnik { } } Motocykl.java
Deklaracja zmiennej typu klasa Deklaracja zmiennej złożonego typu nie różni się od deklaracji zmiennej prostego typu Zmienna typu klasowego nazywa się instancją klasy lub obiektem klasy Samochód S1, S2; Typ danych Nazwa zmiennej
Cykl życia obiektu klasy Deklaracja Inicjalizacja Wykorzystanie Niszczenie
Inicjalizacja obiektu klasy Obiekt klasy (zmienna typu złożonego) musi być inicjowany za pomocą słowa kluczowego new Uwaga: po nazwie typu danych (klasy) używamy nawiasów okrągłych! S1 = new Samochód();
Wykorzystanie obiektu klasy Obiekt klasy zachowuje się jak zmienna: Może występować w instrukcji przypisania wartości Można go przekazać jako argument metody lub pozyskać jako wynik jej działania, etc. Co nie działa z automatu : Operacje relacji (np. porównanie trzeba zaimplementować we własnym zakresie) Operacje wyświetlania/wprowadzania
Likwidacja obiektu klasy Java nie posiada mechanizmu jawnego niszczenia utworzonych obiektów tym się zajmuje środowisko wykonania JRE W celu oznaczenia iż zmienna nie jest już skojarzona z żadnym obiektem, należy jej przypisać wartość null Samochód S1 = null; // domyślnie S1 = new Samochód(); // użycie obiektu S1 = null; // likwidacja
Pola klasy Pole (syn.: atrybut, właściwość) jest zmienną dowolnego typu zdefiniowaną wewnątrz klasy Pole jest dostępne na obszarze całej klasy class Samochód() { String marka; double pojemnośćsilnika; Color kolor; float spalanie; int liczbamiejsc; } Pola klasy
Adresacja pól klasy Wewnątrz klasy: nazwapola Na zewnątrz klasy: obiekt.nazwapola Wszystkie bieżące wartości pól klasy jednoznacznie określają stan obiektu S1 = new Samochód(); S1.marka = "Fiat"; S1.pojemnośćSilnika = 1.6; S1.kolor = Color.Black; S1.liczbaMiejsc = 5;
Pojęcie metody w programowaniu Program = zapis algorytmu w postaci kodu źródłowego Podprogram = samodzielny fragment kodu stosowany w celu redukcji powtórzeń instrukcji, który może posiadać: Własną nazwę Parametry wejściowe (opcjonalnie) Wynik działania (opcjonalnie) Podprogramy w Java są nazywane metodami Deklaracja metody = zdefiniowanie w kodzie źródłowym nazwy, parametrów (argumentów), wyniku oraz treści metody Wywołanie metody = wykonanie instrukcji stanowiących jej treść, w określonym miejscu programu Procedura = metoda nie zwracająca wyników (przest.) Funkcja = metoda zwracająca wynik w miejscu wywołania (określenie popularne np. w C++)
Metody klasy Metoda klasy = metoda zadeklarowana wewnątrz klasy (syn. funkcja klasy) Metoda opisuje zachowanie obiektu i może zmieniać jego stan Metoda ma dostęp do wszystkich pól klasy class Samochód() { Pole klasy int prędkość; void przyspiesz(int kmh) { prędkość += kmh; } void zwolnij(int kmh) { prędkość -= kmh; } } Metody klasy
Deklaracja metody w klasie Metoda może być zadeklarowana w dowolnym miejscu wewnątrz klasy Nie można deklarować metody wewnątrz innej metody, poza szczególnymi przypadkami które zostaną omówione później Przy deklaracji metody należy podać: Jej nazwę (zasady nazewnictwa jak dla zmiennych) Typ danych zwracanej wartości (obowiązkowo) Listę oraz typy danych parametrów wejściowych (opcjonalnie)
Przykłady deklaracji metod Metoda bez parametrów nie zwracająca żadnego wyniku void Info() { // ciało metody } Metoda z parametrami nie zwracająca żadnego wyniku void Drukuj(String tekst) { // ciało metody } Metoda z parametrami zwracająca wartość nie pustą int Kwadrat(int X) { return X*X; }
Przykłady wywołania metod Metoda bez parametrów nie zwracająca żadnego wyniku Info(); Metoda z parametrami nie zwracająca żadnego wyniku Drukuj("Ala ma kota"); Metoda z parametrami zwracająca wartość int wynik = Kwadrat(5);
Wywołanie metody klasy W kodzie tej samej klasy: nazwametody Na zewnątrz klasy: obiekt.nazwametody class Samochód() { int prędkość; void przyspiesz(int kmh) { prędkość += kmh; } void zwolnij(int kmh) { prędkość -= kmh; } void zatrzymaj() { zwolnij(prędkość); } } void main() { Samochód S1; S1.przyspiesz( 10 ); }
Wartość zwracana przez metodę Każda metoda niezależnie od miejsca jej deklaracji, może zwracać wartość określonego typu w miejscu jej wywołana Instrukcja return zwraca wartość oraz kończy wykonanie metody Metoda może posiadać wiele instrukcji return (ale zadziała tylko jedna) String marka() { } return "Skoda"; System.out.println( S.marka() );
Metody typu void Jeśli metoda nie zwraca żadnej wartości, należy ją zadeklarować jako void (zwrot pustej wartości) Metody typu void mogą używać instrukcji return w celu ukończenia wykonania kodu i powrotu do miejsca wywołania metody Po osiągnięciu ostatniej linijki kodu metody, jej wykonanie zostanie zakończone nawet bez użycia return void wyświetl( int[] T ) { for( int x : T ) System.out.print( x ); }
Parametry metody Metoda może posiadać parametry zmienne dowolnego typu, poprzez które do metody zostaną przekazane wartości argumentów double spalanie_w_trasie( double trasa, int rozchód) { return trasa / rozchód; }
Przeciążanie nazwy metody Jeśli w klasie występuje więcej niż jedna deklaracja metody o tej samej nazwie, mówi się że nazwa metody jest przeciążona (ang. overloaded) Metody przeciążone muszą się różnić liczbą i/lub typem parametrów void jedź( int odległość ) { } void jedź( bool kierunek ) { } void jedź( Trasa t ) { }
Rekurencja Metoda może wołać inne metody W przypadku gdy metoda wywołuje sama siebie, mówi się o rekurencji int Silnia( int N ) { if( N <= 2 ) return N; else return N * Silnia(N-1); }
Rekurencja (c.d.) Metoda rekurencyjna powinna przewidywać zakończenie, tj. przynajmniej jedna gałąź nie może zawierać wywołania tej samej metody Rekurencja b. często pozwala na skrócenie zapisu algorytmu oraz zwiększenie jego czytelności Skutkiem ubocznym może być: Niekończąca się rekurencja Wielokrotne wołanie metody z tymi samymi argumentami Przykład: obliczenie N-tej wartości ciągu Fibonacciego metodą rekurencyjną
Konstruktor klasy Konstruktor metoda klasy o takiej samej nazwie jak nazwa klasy Konstruktor jest wołany w momencie utworzenia obiektu klasy za pomocą instrukcji new Jeśli klasa nie posiada konstruktora w jawnej postaci, jest on generowany automatycznie Samochód S = new Samochód();
Wykorzystanie konstruktora W konstruktorze umieszczamy instrukcje inicjalizacji zmiennych obiektu (nadanie domyślnych wartości) Nie zaleca się umieszczać w konstruktorze instrukcji, które mogą wygenerować wyjątek (Exception) Konstruktor nie ma typu i nie zwraca żadnej wartości Samochód() { przebieg = 0; kolor = Color.white; }
Konstruktor z parametrami W celu inicjalizacji obiektów wartościami innymi niż domyślne, można zdefiniować konstruktor z parametrami Liczba konstruktorów klasy nie jest ograniczona (ważne że muszą się różnić argumentami) Samochód() { } Samochód( int cena ) { } Samochód( int rok, double przebieg ) { }
Wskaźnik na bieżący obiekt this Słowo kluczowe this stosuje się do jawnego wskazania na bieżący obiekt klasy class Samochód() { int przebieg; Samochód(int przebieg) { this.przebieg = przebieg; }
Kiedy this jest potrzebny? Jeśli zmienna lokalna ma taką samą nazwę jak zmienna klasy (można obejść stosując różne nazwy) Kiedy obiekt musi wywołać metodę innego obiektu i przekazać samego siebie jako argument (nie ma obejścia) W celu ułatwienia czytania kodu (opcjonalnie) Przekazanie obiektu przez this
Statyczne pola klasy Wartość pola klasy w każdym z jej obiektów może być różna Jeśli pole ma być wspólnych dla wszystkich obiektów, należy zadeklarować go jako statyczne
Wykorzystanie statycznego pola na zewnątrz klasy Adresacja statycznego pola klasy następuje poprzez nazwę klasy (nie nazwę obiektu!)
Statyczne metody Metoda wspólna dla wszystkich obiektów klasy nazywa się statyczną metodą Statyczna metoda należy do klasy, nie do obiektu Statyczna metoda nie może korzystać z pól oraz metod klasy innych niż statyczne (nie zmienia stanu obiektu!)
Klasy wewnętrzne Klasa w Javie może być zadeklarowana wewnątrz innej klasy Klasa wewnętrzna ma dostęp do pól i metod klasy zewnętrznej