Gdańsk, 2014
Ogólnie o Javie Środowisko Java jest językiem programowania, którego podstawowym celem jest realizacja zasady write once, run anywhere. Oznacza to możliwość wykonania tego samego programu, bez konieczności modyfikowania, z gwarancją identycznego zachowania, na wszystkich architekturach sprzętowych, które Javę wspierają. Java jest używana głównie do tworzenia aplikacji sieciowych o architekturze klient-serwer (aplety na stronach WWW plus serwer) oraz do pisania aplikacji mobilnych w systemie Android. Java jest zauważalnie wolniejsza od języków typu C/C++, więc stosuje się ją głównie tam, gdzie czas wykonania aplikacji nie ma większego znaczenia, a jej przenośność owszem.
Ogólnie o Javie Środowisko Cechy Javy: jest językiem ogólnego przeznaczenia; jest obiektowa, opiera się na klasach i interfejsach; wspiera programowanie współbieżne i komunikację sieciową; wspiera aplikacje z GUI; ułatwia tworzenie niezawodnych i bezpiecznych aplikacji; jest językiem interpretowanym (kompilowanym do bajtkodu, który jest następnie interpretowany).
Ogólnie o Javie Środowisko Do uruchamiania Javy potrzebne jest JRE (Java Runtime Environment), do programowania w Javie JDK (Java Development Kit). Oprócz JDK warto zaistalować program ant, który jest odpowiednikiem make dla Javy. Programowanie aplikacji mobilnych wymaga dodatkowo instalacji Android SDK. JDK (Java Development Kit) zawiera w sobie środowisko uruchomieniowe JRE (Java Runtime Environment) oraz programy wspierające tworzenie, wykonywanie i testowanie aplikacji. JDK zawiera m.in. bibliotekę standardową, dokumentację API, przykładowe fragmenty kodu oraz pliki nagłówkowe dla Java Native Interface.
Ogólnie o Javie Środowisko Wśród programów wspierających tworzenie, wykonywanie oraz testowanie aplikacji znajdują się: appletviewer; program do testowania apletów bez pomocy przeglądarki; java; program uruchamiający skompilowane programy (*.class); javac; kompilator przekształcający pliki źródłowe (*.java) do bajtkodu; javadoc; generator tworzący dokumentację na podstawie odpowiednio przygotowanego kodu; jar; program archiwizujący, umożliwiający dystrybuowanie programów w Javie w postaci jednego pliku; javap; konwerter bajtkodu do postaci źródłowej;
Ogólnie o Javie Środowisko javaws; program uruchamiający aplikacje korzystające z Java Web Start; jdb; debugger. Istnieje IDE stworzone z myślą o Javie jest to Eclipse. Jest także Android Studio, IDE do pisania aplikacji mobilnych. Eclipse wspiera także pisanie aplikacji w Androidzie, poprzez specjalną wtyczkę ADT.
Java powstała jako modyfikacja C++, więc będzie tu cały czas z C++ porównywana wskazane zostaną głównie różnice. Program w Javie składa się z klas i interfejsów, wewnątrz których umieszczamy wszystkie inne elementy: zmienne, funkcje itd. Poza klasami mogą się znajdować wyłącznie komentarze. Klasa pełni podobną funkcję jak w C++, interfejs jest zaś zestawem metod, które muszą znajdować się w każdej klasie go implementującej. Wykonywanie programu o ile przeznaczony jest do niezależnego uruchamiania rozpoczyna się od funkcji statycznej main(). Można ją umieścić w klasie o dowolnej nazwie.
Dla przykładu, program drukujący napis Hello, world! może mieć w Javie następującą postać: class Hello { public static void main( String args[] ) { System.out.println( "Hello, world!" ); } } Aby go uruchomić, należy zapisać powyższy kod w pliku o rozszerzeniu java. Po kompilacji programem javac otrzymamy plik Hello.class, który można uruchomić poleceniem java Hello.
Program robiący to samo, w wersji zakręconej: import java.util.vector; class Zakręcona { public static void main( String args[] ) { String napis = "Hr,el ldwl!oo"; Vector< Character > wektor = new Vector< Character >(); for( int i = 0; i < napis.length(); i++ ) wektor.add( napis.charat( 3 * i % napis.length() ) ); for( char c: wektor ) System.out.print( c ); System.out.println(); } }
Zmienne muszą zostać zadeklarowane przed użyciem, robi się to niemal tak samo jak w C++. Jest przy tym 5 istotnych różnic: nazwy zmiennych mogą zawierać znak dolara oraz litery spoza alfabetu łacińskiego; typ[] zmienna deklaruje podaną zmienną jako tablicę; zmienna, której nie nadamy wartości, otrzymuje wartość domyślną (zależną od jej typu); nie ma wskaźników; zmienne usuwane są automatycznie. Typy w Javie dzielą się na podstawowe i referencyjne. Wartością domyślną typów referencyjnych jest null.
Jest 8 typów podstawowych: całkowitoliczbowe ze znakiem: byte (1-bajtowy), short (2-bajtowy), int (4-bajtowy) i long (8-bajtowy); zmiennoprzecinkowe: float (4-bajtowy) i double (8-bajtowy); znakowy char, znaki zapisywane są 2-bajtowo (unikod); logiczny boolean. Wartością domyślną dla typów liczbowych jest 0 (zapisywane 0L dla typu long i 0.0f dla typu float). Wartością domyślną dla typu znakowego jest \u0000, a dla logicznego false.
Typem referencyjnym, oprócz zwykłej klasy, może także być typ wyliczeniowy i tablica. Typy wyliczeniowe w Javie są bardzo rozbudowane, przypominają zwykłe klasy, bo mogą zawierać pola oraz metody. W Javie istnieją także tzw. typy kopertowe: Byte, Short, Integer, Long, Float, Double, Boolean i Character. Umożliwiają one używanie typów podstawowych jak referencyjnych konwersja z typu podstawowego do kopertowego zachodzi automatycznie tam, gdzie jest potrzebna.
Instrukcja new, używana w C++ do przydzielania pamięci na stercie, w Javie używana jest do tworzenia instancji klas: new typ( argumenty ) tworzy instancję podanego typu i inicjalizuje ją przy pomocy konstruktora, któremu przekazuje podane argumenty; new typ[rozmiar] tworzy tablicę podanego typu o podanym rozmiarze. Elementy tablicy można podać jawnie, umieszczając je wewnątrz nawiasów klamrowych bezpośrednio za instrukcją new. Tablica, której elementy nie zostały jawnie określona, jest inicjalizowana konstruktorem domyślnym.
Podczas używania typów referencyjnych należy pamiętać o tym, że a == b sprawdzi, czy podane zmienne zawierają tę samą referencję do porównania zawartości należy użyć funkcji equals(). Inne istotne różnice w korzystaniu z operatorów, w porównaniu do C++: nie ma możliwości przeciążania operatorów; istnieją operatory specyficzne dla Javy, takie jak np. instanceof; do efektywnego kopiowania tablic należy użyć funkcji System.arrayCopy(), a = b skopiuje tylko referencje.
Java ułatwia także programiście korzystanie z typów liczbowych i napisów: literały napisowe automatycznie zmieniane są w zmienne typu String; literały liczbowe mogą być zapisane binarnie (przedrostek 0b), można także użyć znaku podkreślenia do rozdzielenia cyfr.
Wyrażenia i instrukcje w Javie są zbudowane niemal tak samo jak w C++: instrukcje kończą się średnikiem, instrukcje złożone tworzymy przy pomocy nawiasów klamrowych itd. Instrukcja warunkowa if działa tak samo jak w C++, switch niemal tak samo począwszy od wersji 7, zmienna sterująca może być napisem. Pętle while i do działają identycznie jak w C++.
Z pętli for można korzystać jak w C++ lub następująco: for( typ zmienna: tablica ) { blok }. Ta druga postać podstawia do podanej zmiennej kolejne wartości z tablicy (działa jak pętla foreach spotykana w innych językach programowania). Do obsługi wyjątków służy konstrukcja throws/throw/try/catch/finally.
Deklaracja klasy ma postać class Nazwa { ciało klasy }. Nazwa klasy musi zaczynać się od dużej litery. Wewnątrz klasy umieszcza się deklaracje pól, metod oraz bloki inicjalizacyjne. Deklarację klasy można poprzedzić jednym z poniższych modyfikatorów: public; tworzy klasę dostępną poza swoim pakietem; final; tworzy klasę, która nie będzie mogła mieć klas pochodnych; abstract; tworzy klasę abstrakcyjną.
Deklaracje pól/metod wyglądają jak zwykłe deklaracje zmiennych/funkcji, z tym, że można poprzedzić je modyfikatorami: public, protected, private; określają widoczność pola/metody; final; tworzy pole, którego wartość nie może ulec zmianie lub metodę, której nie można przesłonić w klasach pochodnych; static; tworzy pole/metodę statyczną. (Modyfikatorów jest więcej, ale pozostałe: abstract, strictfp, volatile, transient, native i synchronized są rzadziej używane.)
Java nie wspiera dziedziczenia wielobazowego. Aby klasa B dziedziczyła po klasie A należy zadeklarować ją następująco: class B extends A { ciało klasy }. Namiastką dziedziczenia wielobazowego jest możliwość implementacji interfejsów w klasie. W deklaracji klasy, przed jej ciałem, umieszczamy wówczas napis implements, po którym następuje lista interfejsów implementowanych przez daną klasę. Klasa implementująca dany interfejs musi posiadać wszystkie metody, które zostały w nim zadeklarowane.
Metody można przeciążać oraz przesłaniać w klasach pochodnych. Jeśli nie wskażemy jawnie klasy bazowej, stanie się nią Object. Klasy w Javie można zagnieżdżać, istnieją także klasy anonimowe. Słowo kluczowe super daje dostęp do metod/konstruktorów klasy bazowej. Słowo kluczowe this reprezentuje obiekt, dla którego wywołujemy metody. Można go użyć, aby uzyskać dostęp do pól/metod oraz konstruktorów: this.pole, this.metoda() i this( argumenty ).
to odpowiedniki szablonów z C++. Tworzymy je konstrukcją class Nazwa< Parametry > { ciało klasy }. Można narzucić pewne wymagania na parametry: Nazwa; dowolny parametr referencyjny; Nazwa extends Klasa; parametr musi dziedziczyć po podanej klasie; Nazwa super Klasa; parametr musi być nadklasą podanej klasy. Można także tworzyć metody generyczne w zwykłych klasach.
dają możliwość grupowania klas o związanej z sobą funkcjonalności. Aby umieścić klasę w pakiecie, należy umieścić konstrukcję package nazwa; na początku pliku, a sam plik w odpowiednim katalogu. Aby skorzystać z klasy znajdującej się w danym pakiecie należy tę klasę (lub wszystkie obiekty z pakietu) zaimportować. Można także używać konstrukcji NazwaPakietu.NazwaKlasy, instrukcję import można wówczas opuścić.
Zalety posiadania konwencji Nazewnictwo Układ pliku źródłowego Komentarze, instrukcje i deklaracje Deklaracje ułatwiają zarządzanie kodem. Stosowanie spójnego nazewnictwa, korzystanie z komentarzy oraz ustalonego porządku w plikach źródłowych czyni kod łatwiejszym do zrozumienia. Ma to duże znaczenie w przypadku większych aplikacji, bo rzadko zdarza się, by ten sam programista zajmował się taką aplikacją przez cały okres jej życia., które powinny być stosowane w Javie, zostały spisane i są dostępne pod adresem http://www.oracle.com/ technetwork/java/codeconventions-150003.pdf.
Zalety posiadania konwencji Nazewnictwo Układ pliku źródłowego Komentarze, instrukcje i deklaracje Deklaracje Nazwy powinny być tak dobrane, żeby dobrze opisywały pełnione przez nazywany obiekt funkcje. Nazwy skrócone, np. jednoliterowe, powinny być używane wyłącznie dla zmiennych lokalnych. Nazwy klas i pól powinny być rzeczownikami, a nazwy metod czasownikami. Jeśli zachodzi konieczność użycia nazwy złożonej z wielu wyrazów, to wszystkie poza pierwszym powinny zaczynać się z dużej litery. Nazwy klas zaczynamy od dużej litery, nazwy pól i metod od małej. Stałe powinny być pisane dużymi literami, a jeśli są wieloczłonowe, poszczególne człony należy rozdzielić znakiem podkreślenia.
Zalety posiadania konwencji Nazewnictwo Układ pliku źródłowego Komentarze, instrukcje i deklaracje Deklaracje Pliki nie powinny być zbyt długie, jeśli klasa jest zbyt duża, to powinno dać się ją podzielić na mniejsze, łatwiejsze w zarządzaniu. Plik zaczynamy od komentarza określającego jego zawartość. Następnie umieszczamy informację o pakiecie, do którego plik należy, wszystkie instrukcje import oraz deklaracje klas w tej właśnie kolejności. Pierwsza klasa w pliku powinna być publiczna. Wskazane jest, żeby poza nią w jednym pliku występowały tylko klasy wyłącznie z nią związane. Bezpośrednio przed deklaracją klasy umieszczamy jej opis, najlepiej w postaci zrozumiałej dla javadoc-a.
Zalety posiadania konwencji Nazewnictwo Układ pliku źródłowego Komentarze, instrukcje i deklaracje Deklaracje Kolejność deklaracji w klasie: pola statyczne, pola zwykłe, konstruktory, metody. Kolejność w obrębie pól: najpierw publiczne, następnie chronione, na końcu prywatne. Metody grupujemy wg funkcjonalności metody związane z sobą powinny być umieszczane blisko siebie. Wcięcia 4-znakowe, a w liniach kontynuowanych 8-znakowe. Linie powinny mieścić się na ekranie, co w większości przypadków oznacza, że nie powinny być dłuższe niż 80 znaków.
Zalety posiadania konwencji Nazewnictwo Układ pliku źródłowego Komentarze, instrukcje i deklaracje Deklaracje Przed klasą umieszczamy komentarz dokumentacyjny, nie podając w nim szczegółów implementacyjnych. Te zamieszczamy w komentarzu wewnątrz klasy. Komentarze blokowe powinny mieć wygwiazdkowaną postać. Jedna linia = jedna instrukcja. Należy unikać operatora przecinka do łączenia instrukcji (lepiej użyć bloku). Bloki powinny być wcięte.
Zalety posiadania konwencji Nazewnictwo Układ pliku źródłowego Komentarze, instrukcje i deklaracje Deklaracje Jedna linia powinna zawierać tylko jedną deklarację. Deklaracje należy zamieszczać na początku bloków, z jednym jedynym wyjątkiem: zmiennych sterujących pętlami for. Nie należy korzystać z mechanizmu przesłaniania, lepiej użyć innej nazwy. Deklaracje metod należy rozdzielać pustą linią.