Rozdział 4 KLASY, OBIEKTY, METODY



Podobne dokumenty
Wykład 4: Klasy i Metody

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe

Wykład 8: klasy cz. 4

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie obiektowe

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Aplikacje w środowisku Java

Wykład 5: Klasy cz. 3

Programowanie obiektowe

Dokumentacja do API Javy.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

11.6 Klasa do obsługi liczb wymiernych

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

PHP 5 język obiektowy

Definiowanie własnych klas

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

TEMAT : KLASY DZIEDZICZENIE

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Kurs WWW. Paweł Rajba.

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Definicje klas i obiektów. Tomasz Borzyszkowski

Enkapsulacja, dziedziczenie, polimorfizm

Spis treści. 1 Java T M

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podstawy Programowania Obiektowego

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Język C++ zajęcia nr 2

OBIEKTY PHP. G. Panuś

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

Programowanie w Internecie. Java

Deklaracja struktury w C++

Podstawy i języki programowania

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

1 Atrybuty i metody klasowe

Dziedziczenie. Ogólna postać dziedziczenia klas:

Podstawy obiektowości

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Wykład 6: Dziedziczenie

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Lab 9 Podstawy Programowania

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:

Polimorfizm. dr Jarosław Skaruz

Wykład 3 Składnia języka C# (cz. 2)

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Czym są właściwości. Poprawne projektowanie klas

Wykład 5: Więcej o Klasach i Metodach

Materiały do zajęć VII

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Programowanie strukturalne i obiektowe. Funkcje

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki i techniki programowania Ćwiczenia 2

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Deklaracja i definicja metod, zwracanie wartości z metod, przekazywania parametrów do metod

Argumenty wywołania programu, operacje na plikach

Metody Metody, parametry, zwracanie wartości

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

10. Programowanie obiektowe w PHP5

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Podstawy i języki programowania

Zaawansowane programowanie w języku C++ Klasy w C++

Programowanie obiektowe

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie komputerowe. Zajęcia 7

Programowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Interfejsy i klasy wewnętrzne

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Definiowanie własnych klas

Transkrypt:

Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej klasy. Aby utworzyć obiekt należy najpierw zdefiniować klasę, która jest wzorem do tworzenia obiektów tej klasy. Klasa definiuje zarówno dane jak i algorytmy służące do ich przetwarzania. Dane są zapisywane w klasie w postaci pól (zmiennych lub stałych składowych), a algorytmy w postaci metod. Metodą jest wydzielony fragment programu, na ogół zawierający parametry, który może operować na ściśle określonych danych. Aby utworzyć klasę, należy użyć słowa kluczowego class wykorzystując poniższy schemat (tekst następujący w wierszu po dwóch znakach // jest komentarzem): class nazwaklasy // deklaracja pól typ zmiennapierwsza; typ zmiennadruga;... // deklaracja metod typ metodapierwsza(parametry)

16 4. KLASY, OBIEKTY, METODY // ciało metody typ metodadruga(parametry) // ciało metody... Dla przykładu rozważmy klasę pozwalającą tworzyć obiekty zawierające informacje o paczkach, które na przykład trzeba przewieźć ciężarówką. Paczek jest więcej niż może pomieścić ciężarówka i chodzi o to, by załadować na ciężarówkę jak najwięcej paczek tak, aby suma wartości tych paczek była maksymalna. Dla każdej paczki musimy zatem dysponować następującymi danymi: długość podstawy, szerokość podstawy, wysokość i oczywiście wartość paczki. Pierwsza wersja klasy Paczka (bez projektowania metod) może wyglądać następująco (typ int jest typem całkowitym omówionym w rozdziale 5): class Paczka int dlugosc; int szerokosc; int wysokosc; int wartosc; Obiekt klasy Paczka możemy utworzyć w dwóch etapach. Najpierw trzeba zadeklarować referencję do obiektu klasy Paczka: Paczka telewizor; Referencja czyli inaczej odnośnik identyfikuje dany obiekt. Możemy sobie wyobrazić, że referencja podaje między innymi adres w pamięci, gdzie jest umieszczony obiekt, jego wielkość itp. Po wykonaniu powyższej instrukcji zmienna telewizor posiada wartość null, czyli nie zawiera referencji do żadnego obiektu. Aby utworzyć nowy obiekt, należy wykorzystać operator new:

4. KLASY, OBIEKTY, METODY 17 telewizor = new Paczka(); Operator new tworzy nowy obiekt klasy Paczka, a referencja do niego jest przypisywana zmiennej telewizor (przy pomocy operatora =). Od tego momentu zmienna telewizor nie posiada już wartości null, lecz odnosi się do pewnego obiektu klasy Paczka. Obie powyższe instrukcje można połączyć i utworzyć obiekt klasy Paczka w jednym etapie: Paczka telewizor = new Paczka(); Każdy obiekt posiada własną kopię pól zadeklarowanych w klasie. Dostęp do tych pól można uzyskać przy pomocy operatora.. (kropka). Ustawienie wartości wszystkich pól dla obiektu, do którego referencją jest zmienna telewizor wygląda następująco: telewizor.dlugosc = 150; telewizor.szerokosc = 80; telewizor.wysokosc = 120; telewizor.wartosc = 6000; Obiektów danej klasy można utworzyć dowolnie dużo. Dla przykładu utworzymy jeszcze jeden obiekt klasy Paczka: Paczka pralka = new Paczka(); Wartości pól obiektu, do którego referencją jest zmienna pralka, ustawiamy analogicznie jak poprzednio: pralka.dlugosc = 70; pralka.szerokosc = 50; pralka.wysokosc = 130; pralka.wartosc = 5000; Jeszcze raz podkreślmy, że każdy obiekt klasy Paczka ma swoją własną kopię pól zdefiniowanych w klasie. Ilustruje to rys. 4.1. Obliczenie objętości paczki - obiektu, do którego referencją jest zmienna telewizor można dokonać przy pomocy instrukcji: obj = telewizor.dlugosc * telewizor.szerokosc * telewizor.wysokosc;

18 4. KLASY, OBIEKTY, METODY Rysunek 4.1: Obiekty klasy Paczka, do których referencjami są telewizor i pralka Każde pole i metoda zdefiniowane w klasie może mieć wyszczególniony specyfikator dostępu określany przez słowa: public, private oraz protected. Umieszczenie słowa public oznacza, że dany składnik jest dostępny w całym programie. Słowo private oznacza, że dany składnik może być wykorzystywany tylko przez metody danej klasy. Specyfikator dostępu określony przez słowo protected jest omówiony w rozdziale 13 i na razie nie będziemy się nim zajmować. Istnieje jeszcze specyfikator domyślny występujący wtedy, gdy nie używamy żadnego słowa (pola zdefiniowane w dotychczasowej wersji klasy Paczka miały właśnie domyślny specyfikator dostępu). Domyślny specyfikator ma znaczenie takie samo jak specyfikator public dla klas zdefiniowanych w tym samym pakiecie. Ponieważ pakietami zajmiemy się dopiero w rozdziale 16, na razie przyjmiemy, że specyfikator domyślny jest równoważny specyfikatorowi public. Zmieńmy teraz definicję klasy Paczka w sposób następujący: class Paczka private int dlugosc; private int szerokosc; private int wysokosc; private int wartosc; W tym przypadku nie ma już możliwości wykorzystywania w programie instrukcji rodzaju: telewizor.dlugosc = 150;

4. KLASY, OBIEKTY, METODY 19 czy też obj = telewizor.dlugosc * telewizor.szerokosc * telewizor.wysokosc; Pola dlugosc, szerokosc, wysokosc i wartosc są niedostępne na zewnątrz klasy. I tak w większości przypadków powinno być. Dostęp do tych pól czy też wykonywanie na nich operacji powinno odbywać się przy pomocy metod. Ogólny schemat dla utworzenia metody jest następujący: typ nazwa(parametry) // ciało metody Dla przykładu utwórzmy teraz metodę pozwalającą na obliczenie objętości paczki. public int ObliczObj() return dlugosc * szerokosc * wysokosc; Metoda ta powinna być umieszczona wewnątrz definicji klasy Paczka: class Paczka private int dlugosc; private int szerokosc; private int wysokosc; private int wartosc; public int ObliczObj() return dlugosc * szerokosc * wysokosc; Metoda ObliczObj() nie zawiera żadnych parametrów i działa na polach zdefiniowanych w klasie Paczka. Mimo że są to pola ze specyfikatorem

20 4. KLASY, OBIEKTY, METODY private metoda obliczobj() ma oczywiście do nich dostęp, ponieważ sama jest składnikiem klasy Paczka. Zwróćmy uwagę na słowo kluczowe return oznaczające powrót do instrukcji, w której dana metoda została wywołana wraz z podaniem obliczonej wartości do nazwy funkcji. Obecnie zajmiemy się szczególną metodę zwaną konstruktorem. Konstruktor jest wywoływany zawsze w momencie tworzenia obiektu. Jeżeli konstruktor nie został zdefiniowany, to wtedy jest wywoływany konstruktor domyślny - bezparametrowy przypisujący wszystkim polom wartość 0. Jeżeli w klasie jest zdefiniowany konstruktor z parametrami, to wtedy konstruktor domyślny nie jest tworzony automatycznie. W razie konieczności wykorzystywania konstruktora bez parametrów trzeba go jawnie zdefiniować. Konstruktor ma zawsze nazwę taką samą jak nazwa klasy i w jego definicji nie wolno podać typu. Na przykład, zaprojektujmy konstruktor dla klasy Paczka: public Paczka(int adl,int aszer,int awys,int awart) dlugosc = adl; szerokosc = aszer; wysokosc = awys; wartosc = awart; Konstruktor ten ma cztery parametry, nazywane często parametrami formalnymi, których wartości służą do przypisania wartości polom obiektu. Tak jak dla innych metod definicję konstruktora umieszczamy wewnątrz definicji klasy: class Paczka private int dlugosc; private int szerokosc; private int wysokosc; private int wartosc; public Paczka(int adl,int aszer,int awys,int awart) dlugosc = adl;

4. KLASY, OBIEKTY, METODY 21 szerokosc = aszer; wysokosc = awys; wartosc = awart; public int ObliczObj() return dlugosc * szerokosc * wysokosc; Obiekty klasy Paczka możemy teraz tworzyć przy pomocy instrukcji: Paczka telewizor = new Paczka(150,80,120,6000); Utworzony obiekt klasy Paczka, do którego referencją jest zmienna telewizor, ma swój zestaw pól o przypisanych wartościach 150,80,120,6000. Zwróćmy uwagę, że parametry podane w momencie wywołania metody - w tym przypadku konstruktora, są nazywane parametrami aktualnymi. Trzeba zapamiętać, że w języku Java parametry są przekazywane zawsze przez wartość, co oznacza, że wartość parametru aktualnego jest przekazywana do parametru formalnego. Oznacza to, że nie ma możliwości zmiany parametru aktualnego poprzez wykonanie metody. Do tego zagadnienia powrócimy jeszcze w następnych rozdziałach, a teraz zastanówmy się, jak obliczyć objętość paczki - obiektu, do którego referencję zawiera zmienna telewizor. Otóż wystarczy w tym celu wywołać metodę obliczobj() dla odpowiedniego obiektu klasy Paczka, wykorzystując operator kropki. Ilustruje to poniższa instrukcja: int obj1 = telewizor.obliczobj(); Metody z danej klasy czyli w naszym przypadku klasy Paczka mogą być wywoływane wyłącznie dla obiektów tej klasy. A zatem na przykład, jeżeli obiekt o nazwie inny jest obiektem innej klasy niż Paczka, to poniższa instrukcja spowoduje błąd kompilacji: int obj1 = innny.obliczobj(); // BŁĄD KOMPILACJI Zasygnalizujmy jeszcze skąd metoda obliczobj() wie dla jakiego obiektu, czyli na jakich wartościach, ma wykonać obliczenia. Jak wiadomo, obiektów klasy Paczka może być dowolnie dużo i metoda obliczobj()

22 4. KLASY, OBIEKTY, METODY może obliczyć objętość każdego z tych obiektów. W momencie wywołania metody obliczobj() jest do niej przekazywana referencja do obiektu, na rzecz którego nastąpiło wywołanie. W naszym przypadku referencją tą jest telewizor i dla tego obiektu nastąpią obliczenia. Referencję tę można do metody przekazać w sposób jawny przy pomocy słowa kluczowego this, co wyjątkowo może być przydatne. Zostanie to omówione w dalszej części książki w rozdziale 11. Przeanalizujmy teraz ostatnią wersję definicji klasy Paczka. Ponieważ pola klasy są deklarowane ze specyfikatorem private, nie ma możliwości wykonywania na nich operacji na zewnątrz klasy. I bardzo dobrze. Do nadania wartości początkowych polom obiektu klasy Paczka służy konstruktor, a do obliczenia objętości metoda obliczobj(). Może być jednak potrzebne wyprowadzenie rozmiarów obiektu - paczki czy też jej wartości. W tym celu można utworzyć metody deklarowane ze specyfikatorem public, co oznacza, że można je wykonać w całym programie. Jedna z tych metod ma postać: public int PodajDlugosc() return dlugosc; Zadaniem metody podajdlugosc() jest tylko zwrócenie wartości odpowiedniego pola klasy. Można się teraz zastanowić, czy warto było pola klasy deklarować ze specyfikatorem private. Czy nie lepiej po prostu zezwolić na dostęp do nich w całym programie. Otóż na pewno warto. Dzięki temu przypisanie wartości tym polom odbywa się wyłącznie w konstruktorze i przy szukaniu błędu w programie nie musimy sprawdzać, czy gdzieś w programie nie nastąpiła przypadkowa zmiana wartości któregoś z pól. Ponadto przykładowa metoda podajdlugosc() jest najprostsza z możliwych i łatwo można dokonać jej zmiany tak, by zwracała zmodyfikowaną wartość pola (na przykład można przeliczyć centymetry na metry). Ostateczna wersja definicji klasy Paczka jest zatem następująca: class Paczka private int dlugosc; private int szerokosc;

4. KLASY, OBIEKTY, METODY 23 private int wysokosc; private int wartosc; public Paczka(int adl,int aszer,int awys,int awart) dlugosc = adl; szerokosc = aszer; wysokosc = awys; wartosc = awart; public int PodajDlugosc() return dlugosc; public int PodajSzerokosc() return szerokosc; public int PodajWysokosc() return wysokosc; public int PodajWartosc() return wartosc; public int ObliczObj() return dlugosc * szerokosc * wysokosc; public int ObliczPodst() return dlugosc * szerokosc;

24 4. KLASY, OBIEKTY, METODY Zauważmy, że w definicji klasy Paczka dodaliśmy jeszcze metodę oblicz- Podst() pozwalającą obliczyć pole powierzchni podstawy paczki, co może się przydać przy upakowywaniu paczek. Po tym wstępie możemy wreszcie podać jak napisać pierwszy program w języku Java. Program jest również obiektem pewnej klasy, która musi być zdefiniowana ze słowem public. Koniecznie trzeba zapamiętać, że nazwa pliku, w którym jest umieszczona ta klasa, musi być taka sama jak nazwa klasy, uwzględniając również duże litery. Wykonanie programu rozpoczyna się od metody o nazwie main() typu void (co oznacza, że nie zwraca ona żadnej wartości) zadeklarowanej ze specyfikatorami public i static. Specyfikator static zostanie dokładnie omówiony w rozdziale 11, a teraz musi nam wystarczyć informacja, że składniki zadeklarowane ze słowem static są związane z klasą, a nie z poszczególnymi obiektami klasy. Jeżeli składnik jest zadeklarowany ze słowem static, to możemy mieć do niego dostęp bez utworzenia żadnego obiektu tej klasy (podajemy nazwę klasy i po kropce nazwę składnika). Wszystkie pola statyczne mają taką samą wartość dla wszystkich utworzonych obiektów danej klasy. Ponadto metody statyczne mogą wykorzystywać wyłącznie składniki statyczne (pola i metody). Metoda main() posiada parametry, które są tablicą typu String. Wykorzystanie tych parametrów omówimy bliżej w rozdziale 9. Schemat, według którego możemy utworzyć program, może być następujący: public class Pierwszy public static void main(string[] args) new Pierwszy(); // utworzenie obiektu klasy Pierwszy public Pierwszy() // instrukcje // konstruktor dla klasy Pierwszy

4. KLASY, OBIEKTY, METODY 25 W metodzie main() tworzymy wyłącznie obiekt klasy Pierwszy. Obiekt ten jest naszym programem. W momencie tworzenia obiektu zawsze jest wywoływany konstruktor, który w tym przypadku istnieje i oczywiście ma nazwę Pierwszy(). Referencji do obiektu klasy Pierwszy nie zapamiętujemy w żadnej zmiennej, po prostu nie jest to do niczego potrzebne. Natomiast wszystkie niezbędne instrukcje zapisujemy w konstruktorze. A oto nasz pierwszy program skonstruowany zgodnie z powyższym schematem: Program 4.1 public class Pierwszy public static void main(string[] args) new Pierwszy(); public Pierwszy() Paczka telewizor = new Paczka(150,80,120,6000); int objetosc1 = telewizor.obliczobj(); System.out.println("Objętość paczki o rozmiarach: " + \n + telewizor.podajdlugosc()+ ", "+ telewizor.podajszerokosc() + ", " + telewizor.podajwysokosc() + \n + "wynosi: " + \n + objetosc1); Zadaniem tego prostego programu jest utworzenie obiektu klasy Paczka, obliczenie objętości tego obiektu i wyprowadzenie niezbędnej informacji. Zwróćmy uwagę, że do wyprowadzenia informacji można wykorzystać instrukcję

26 4. KLASY, OBIEKTY, METODY System.out.println(par); gdzie parametr par może być typu String (typ int jest automatycznie transformowany do typu String). Więcej informacji o klasie String zawiera następny rozdział. Teraz zauważmy tylko, że operator + służy do łączenia obiektów klasy String, a znak \n umożliwia wyprowadzenie znaku nowej linii. Zauważmy jeszcze, że program w języku Java można zaprojektować, wykorzystując tylko metodę main() bez konstruktora klasy. Ilustruje to poniższy schemat: public class Drugi public static void main(string[] args) // instrukcje Program 4.2, skonstruowany zgodnie z powyższym schematem, wykonuje analogiczne operacje jak program 4.1: Program 4.2 public class Drugi public static void main(string[] args) Paczka telewizor = new Paczka(150,80,120,6000); int objetosc1 = telewizor.obliczobj(); System.out.println("Objętość paczki o rozmiarach: "); System.out.println(telewizor.PodajDlugosc()+ ", "+ telewizor.podajszerokosc() + ", " + telewizor.podajwysokosc() + \n + "wynosi: "); System.out.println(objetosc1);

4. KLASY, OBIEKTY, METODY 27 Rozwiązanie pierwsze będziemy stosować częściej, ponieważ po pierwsze jasno stwierdza, że program jest też obiektem, a po drugie umożliwia wywoływanie w konstruktorze klasy metod, które nie są statyczne. W metodzie main(), która jest statyczna, można wywoływać tylko metody statyczne. Aby wykorzystać metodę, która nie jest statyczna, należy utworzyć obiekt danej klasy i dopiero dla tego obiektu wywołać metodę. Zostanie to dokładniej zilustrowane w rozdziale 9. Natomiast rozwiązanie drugie można zastosować do przetestowania klasy, którą będziemy później wykorzystywać w innych aplikacjach. Niezbędne instrukcje testujące zamieszczamy wtedy w metodzie main(). Więcej przykładów ilustrujących pracę z metodami i przekazywanie parametrów zawiera rozdział 9, a obecnie zwrócimy jeszcze uwagę na możliwość przypisywania referencji. Wyobraźmy sobie, że mamy zadeklarowane trzy zmienne referencyjne do obiektów klasy Paczka: ref1, ref2, ref3. Można tego dokonać przy pomocy instrukcji: Paczka ref1, ref2, ref3; Jak już wiemy, w tej chwili zmienne te nie odnoszą się do żadnego obiektu, a ich wartość jest null. Utwórzmy teraz dwa obiekty klasy Paczka, do których referencję będą zawierały zmienne ref1 i ref2: ref1 = new Paczka(50,50,10,100); ref2 = new Paczka(100,100,40,500); Zmienna referencyjna ref3 w dalszym ciągu posiada wartość null. W języku Java można dokonać następującego przypisania: ref3 = ref1; Oznacza to, że zmienna ref3 zawiera referencję do tego samego obiektu, do którego odnosiła się zmienna ref1. Zmiennej ref3 można następnie przypisać wartość innej zmiennej referencyjnej, co ilustruje poniższa instrukcja. ref3 = ref2; Program 4.3 ilustruje możliwości stwarzane przez przypisywanie referencji.

28 4. KLASY, OBIEKTY, METODY Program 4.3 public class Trzeci public static void main(string[] args) new Trzeci(); public Trzeci() Paczka ref1, ref2, ref3; // utworzenie dwóch obiektów klasy Paczka ref1 = new Paczka(50,50,10,100); ref2 = new Paczka(100,100,40,500); ref3 = ref1; System.out.println("Objętość paczki o rozmiarach: " + ref3.podajdlugosc()+ ", "+ ref3.podajszerokosc() + ", " + ref3.podajwysokosc() + \n + "wynosi: " + ref3.obliczobj()); ref3 = ref2; System.out.println("Objętość paczki o rozmiarach: " + ref3.podajdlugosc()+ ", "+ ref3.podajszerokosc() + ", " + ref3.podajwysokosc() + \n + "wynosi: " + ref3.obliczobj()); I ostatnia już informacja w tym rozdziale. W języku Java nie ma konieczności dbania o usuwanie obiektów już niepotrzebnych. System sam usunie wszystkie obiekty, do których nie istnieje żadna referencja.