1 / 129

Java – wstęp do języka

Java – wstęp do języka. Andrzej Chybicki Andrzej.Chybicki@eti.pg.gda.pl Pok. 744. To co już powinniśmy wiedzieć…. Składnia, gramatyka i doświadczenie w programowaniu w C/C++ Idea i zasada programowania obiektowego (C++) (klasy, zmienne) Podstawowe mechanizmy dziedziczenia

emery
Download Presentation

Java – wstęp do języka

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java – wstęp do języka Andrzej Chybicki Andrzej.Chybicki@eti.pg.gda.pl Pok. 744

  2. To co już powinniśmy wiedzieć… • Składnia, gramatyka i doświadczenie w programowaniu w C/C++ • Idea i zasada programowania obiektowego (C++) (klasy, zmienne) • Podstawowe mechanizmy dziedziczenia • Ogólna wiedza z dziedzin tworzenia aplikacji (inżynieria oprogramowania) • Zakładam, że student nie napisał żadnej aplikacji w języku Java – java od podstaw

  3. Historia Javy • Początki języka Java sięgają roku 1990, gdy Bill Joy napisał dokument pod tytułem “Further”, w którym sugerował inżynierom Sun Microsystems stworzenie obiektowego środowiska w oparciu o C++. Dokument ten miał pewien wpływ na twórców projektu Green (James Gosling, Patrick Naughton i Mike Sheridan). W roku 1991 w ramach projektu Green opracowano w języku C kompilator oraz interpretator wynalezionego przez Goslinga języka OAK (Object Application Kernel), który miał być narzędziem do oprogramowania “inteligentnych” konsumenckich urządzeń elektronicznych. Ponieważ nazwa “OAK” okazała się zastrzeżona, zmieniono ją na “Java”.

  4. Java – język czy coś więcej? • Java oczywiście jest językiem programowania, lecz w praktyce na Javę składają się inne elementy funkcjonalne: • Kompilator • Maszyna wirtualna „Java” (JVM). • Biblioteki języka Java • Obiektowy język programowania bazujący na składni języka C++

  5. 1.Kompilator • Kompilator który przetwarza program “nazwa.java” na tak zwany B-kod (bytecode, J-code), zapisywany automatycznie w plikach z rozszerzeniem nazwy “.class”. B-kod jest przenośną postacią programu, która może być zinterpretowana przez odpowiednią maszynę wirtualną, to jest “urządzenie logiczne”, na którym będzie wykonywany program binarny

  6. 2. Maszyna wirtualna Javy (ang. JVM – Java Virtual Machine) • JVM można uważać za abstrakcyjny komputer, który wykonuje programy, zapisane w plikach z rozszerzeniem nazwy “.class”. Maszyna wirtualna może być implementowana na rzeczywistych komputerach na wiele sposobów, na przykład jako interpretator wbudowany w przeglądarkę WWW (np. Netscape), lub jako oddzielny program, który interpretuje pliki “nazwa.class”. Może to być także implementacja polegająca na przekształceniu tuż przed rozpoczęciem fazy wykonania pliku z B-kodem na program wykonalny, specyficzny dla danej maszyny. Mechanizm ten można określić jako tworzenie kodu wykonalnego w locie (ang. Just-In-Time, np. kompilator JIT firmy Symantec). Interpretatory B-kodu, tj. różne maszyny wirtualne, są także często napisane w języku Java.

  7. JVM • JVM nie jest osobną maszyną w sensie sprzętowym, lecz w sensie programowym • Można powiedzieć, że JVM jest nakładką na system umożliwiającą kompilowanie i wykonywanie aplikacji Java. • JVM a szybkość… inicjalizacja i kompilowanie JIST

  8. JVM a OS

  9. Java a niezależność sprzętowo-programowa

  10. Język Java • Oparty o składnię C++ • Prawdziwie obiektowy (tylko obiektowy!!) • Podział na klasy • Jedna klasa główna – metoda „main”, która stanowi „wejście” do programu • Program w języku „Java” nazywa się aplikacją (samodzielna) lub applet (aplikacja sieciowa)

  11. Aplikacje Java • Warunek uruchomienia: zainstalowanie na komputerze JDK (Java Developement Kit) lub JRE (ang. Java Runtime Enviroment). • Każda aplikacja musi zawierać dokładnie jeden moduł źródłowy nazywany modułem głównym aplikacji zawierającym definicje klas, w którym jedna z klas zawiera publiczną funkcję klasy (funkcje takie są poprzedzane słowem kluczowym static) main. • Funkcje w języku Java są zawsze własnością klas lub obiektów i nazywa się je metodami (ang. methods)

  12. Plik który zawiera metodą main jest „wejściem” do aplikacji Java. Musi on posiadać tę samą nazwę co nazwa klasy, która posiada metodę main. • Aplikacja składająca się z wielu pakietów (modułów) i klas może posiadać kilka klas z metodą „main”. • Metoda main musi być publiczna i statyczna • public static void main(String args[]) • Przykładowy program wygląda następująco:

  13. Kompilacja i uruchomienie aplikacji Java • Kompilacja programu: javac Hello.java, o ile mamy prawidłowo ścieżkę ustaloną do javac • Udana kompilacja wygeneruje plik z B-kodem o nazwie Hello.class, zawierający sekwencję instrukcji dla interpretatora JVM. Kod ten wykonujemy przez wywołanie interpretatora o nazwie java poleceniem: java Hello

  14. Omówienie przykladu • Interpretator wyszuka plik o nazwie Hello.class, ustali, czy klasa Hello zawiera publiczną metodę statyczną main i wykona instrukcje zawarte w bloku main. • Nie ma wielkości globalnych: wszystkie zmienne i stale są własnością klas lub obiektów. • Wartością parametru arg[0] jest pierwszy po nazwie programu spójny ciąg znaków

  15. Konsola w Javie – klasa system • Klasa System zawiera statyczny obiekt składowy typu PrintStream o nazwie out; wywołanie System.out oznacza pisanie do standardowego strumienia wyjściowego. Klasa PrintStream zawiera szereg przeciążeń metody o nazwie print; jedno z nich przyjmuje parametr typu String. Kompilator automatycznie tłumaczy literał stały Hello, World\n na odpowiedni obiekt klasy String; odnośnik (referencja) do tego obiektu jest przekazywana do metody System.out.print(). Metoda print() generuje jeden wiersz wyjściowy i powraca do metody main, która kończy wykonanie programu. • Standardowe wyjście z poziomu programu wygląda tak samo : System.out.* niezależnie od systemu i sposobu uruchomienia programu .

  16. Identyfikatory i znaki specjalne • Słowa zarezerwowane (true, false, if , switch, case…) – bazujące zasadniczo na składni C/C++ • Słowa kluczowe (abstract, final) – można używać tylko w ściśle określonym kontekście

  17. Zastrzeżone słowa w Java

  18. Klasy w Javie Definicja klasy ma postać: Deklaracja klasy { Ciało klasy }

  19. Klasy • Słowo kluczowe class można poprzedzić slowami: abstract, public, final • Po słowie class można umieścić wyrażenia: • ‘extends nazwa_superklasy’ oraz ‘implements nazwy_interfejsów’ • Mechanizm dziedziczenia już omówiliśmy • Mechanizm interfejsów w Javie dopiero omówimy. • Java nie umożliwia wielodziedziczenia ale można to zrobić używając mechanizmów interfejsów

  20. Klasa Object •  Uwaga. W języku Java każda klasa dziedziczy od predefiniowanej klasy Object. Zatem, jeżeli w definicji klasy nie występuje fraza extends, to jest to równoważne niejawnemu wystąpieniu w tej definicji frazy ‘extends Object’

  21. protected  Objectclone() • booleanequals(Object obj) • voidfinalize() • ClassgetClass() • InthashCode() • voidnotify() • voidnotifyAll() •  StringtoString() • voidwait() • voidwait(long timeout)

  22. Zmienne klasy • Zmienne klasy (statyczne, tj. poprzedzone słowem kluczowym static), konstruktor i metody oraz funkcje klasy (statyczne) także są poprzedzanie słowem static. • Nazwa każdej zmiennej składowej, zmiennej klasy, metody lub funkcji klasy musi być poprzedzona nazwą typu (np. boolean, double, char, float, int, long, void). • Zmienne i metody statyczne są traktowane analogicznie jak w C++

  23. Dostęp do zmiennych i metod klasy • private • protected • public • niezdefiniowany

  24. Zmienne i metody • Zmienne i metody typu static • przypomnienie • Zmienne i metody final • Zmienne ,która nie może być modyfikowana • Metoda, która nie może redefiniowana w klasach dziedziczących • Klasa po której nie można dziedziczyć • Lokalne zmienne finalne, które zostały zadeklarowane, ale jeszcze nie zainicjowane, nazywa się blank final.

  25. Słowa kluczowe this i super • Dostęp do elementów klasy uzyskuje się za pomocą operatora kropkowego. Jeżeli element danej klasy (zmienna lub metoda) przesłania (overrides) jakiś element swojej superklasy, to można się do niego odwołać za pomocą słowa kluczowego super, jak w poniższym przykładzie • Spójrzmy na przykład:

  26. Omówienie przykładu • ASillyClass oob; • oob = new ASillyClass(); • Większość klas (wbudowanych lub definiowanych przez użytkownika) inicjalizujemy za pomocą operatora new • Do kontrolowania ilości obiektów danej klasy czasami są używane tzw. Fabryki obiektów.

  27. Konstruktory w Javie • Konstruktory w Javie definiujemy analogicznie jak w C++. Konstruktor musi być zawsze jawny i zwracać obiekt klasy w jakiej jest inicjowany. • W javie nie ma destruktorów obiektów • Wady • Zalety • „Utylizacją” nieużywanych obiektów w Java zajmuje się mechanizm „Garbage collector” – omówimy go później

  28. Konstruktory w Javie • Jeżeli dana klasa nie zawiera deklaracji konstruktorów, to kompilator dostarcza konstruktor domyślny z pustym wykazem argumentów, który w swoim bloku wywołuje konstruktor super() jej bezpośredniej nadklasy. Weźmy dla ilustracji definicję klasy Point: public class Point { int x, ,y; } • Jest ona równoważna definicji public class Point { int x, ,y; public Point() { super(); } } z niejawnym wywołaniem dostarczanego przez kompilator konstruktora superklasy, od której bezpośrednio dziedziczy klasa Point.

  29. Dostęp do metod i pól superklasy (klasy bazowej) • Odwołanie się do pól i metod superklasy odbywa się poprzez słowo kluczowe super. • Czasami ważne jest mieć pewność ze odwołujemy się do pól i metod obiektu w którym aktualnie jesteśmy – w takim przypadku używamy słowa kluczowego this • Operator this zawsze zwraca obiekt w którym znajduje się aktualnie wykonana instrukcja.

  30. Niejawne wywoływania konstruktorów superklasy • Spójrzmy na przykład:

  31. Konstruktor super() może być również wywoływany jawnie • Spójrzmy na przykład

  32. Konstruktory – this(…) i super(…) • Uwaga. instrukcja this(argumenty); musi być pierwszą instrukcją w ciele konstruktora lub metody; to samo dotyczy instrukcji super(argumenty);.

  33. Sprzątanie obiektów w Java • Inicjalizacja obiektów występuje zawsze kiedy chcemy ich użyć – co do tego każdy programista jest świadomy • Garbage Collector - gc (odśmiecacz pamięci) automatycznie pozbywa się obiektów nieużywanych – ale nie zawsze powoduje zwolnienie całej pamięci wykorzystywanej przez te obiekty

  34. Szczególny przypadek • Odśmiecacz zwalnia tylko pamięć zalokowaną przez obiekt z wykorzystaniem operatora new • Jeśli obiekt w inny sposób alokuje pamięć odśmiecacz może sobie nie dać rady • Rozwiązanie – metoda finalize()

  35. Używamy metody finalize() • Jeżeli obiekt posiada metoda finalize() to odśmiecacz będąc gotowy do zwolnienia obiektu najpierw wywoła metodę finalize() • Dopiero przy kolejnym odśmiecaniu zażąda zwrotu pamięci samego obiektu • Zdefiniowanie metody finalize() leży w gestii użytkownika!!

  36. Finalize() a destruktory C++ • Finalize() i destruktory C++ to nie to samo!! • C++ - destruktor zawsze niszczy obiekt • Finalize powoduje jedynie zwolnienie ewentualnej pamięci lub uchwyty do pliku, zasobu sieciowego – ale nie niszczy obiektu • Kiedy i jak używamy finalize()? • Używamy przed zniszczeniem obiektu, aby ewentualne zasoby związane z obiektem których gc nie wyczyści samemu zwolnić • Spójrzmy na przykład:

  37. Wywolanie finalize()

  38. Wynik Tytul ksiazki Finalizujemy obiekt przy index = 3 W powyższym przykładzie ręcznie uruchomiliśmy gc , ale JVM automatycznie uruchamia gc w przypadku alokacji lub zwalniania dużej ilości zasobów

  39. Zasada działania gc • Zasada działania sterty w C++ - plac w którym poszczególne obiekty zajmują pamięć (powierzchnię) potrzebną im do życia • W Java stertę można porównać do przesuwającej się taśmy, w której każdy nowy obiekt alokuje nową część taśmy – co powoduje szybkie wyczerpanie pamięci

  40. Sztuczki w gc – mechanizmy oszczędzania pamięci • Gc podczas „zbierania śmieci” porządkuje obiekty w obszar ciągły przesuwając wskaźnik taśmy. • Są różne techniki odśmiecania , które obiekty wyrzucać, które zostawiać, jak to sprawdzać? • Liczenie referencji • Zliczanie odwołań

  41. Tablice w Java • Każda tablica w Java jest obiektem • Dynamicznie tworzona – nie ma problemy zarządzania pamięcią (wyręcza nas w tym kompilator i JVM) • Zmienna prezentująca tablicę jest tak naprawdę referencją do pamięci pierwszego z elementów tablicy (jak w C/C++)

  42. Tablice – ciąg dalszy • Obiekty lub składowe tablicy nazywa się elementami • Każdy obiekt tablicowy zawiera pole length zawierający ilość elementów w tablicy • Elementy są numerowane od 0 • Niezainicjowane (ale zadeklarowane!!) elementy tablicy mają inicjalną wartość = 0 • Elementami tablic mogą być typy proste (int, float , double) oraz typy złożone (obiekty – nie klasy), null’e, • Tablice mogą być inicjowane jako tablice elementów klasy abstrakcyjnej pod warunkiem… no właśnie - jakim warunkiem??

  43. I jeszcze parę istotnych uwag o tablicach • Semantyka : • Deklaracja nośnika tablicy: int[] tab; • Zainicjowane tab = new int[3]; • Albo od razu: int[] tab = new int[3]; • Inny sposób: int[] tab = {0, 0, 0 }; • Spójrzmy na przykład:

  44. Wynik i dyskusja ia[0] = 1 ia[1] = 2 ia[2] = 3 da[0] = 1.3 da[1] = 2.5 da[2] = 3.4 Klasa obiektu ia: class [I Klasa obiektu da: class [D class java.lang.Object

  45. Drobna uwaga • Dla tablicy wielowymiarowej sygnatura byłaby poprzedzona odpowiednią liczbą nawiasów prostokątnych. Np. instrukcja • System.out.println("Klasa obiektu: "+(new float [3][4][5]).getClass()); da wydruk: • Klasa obiektu: class [[[F

More Related