JAVA – wstęp
Java - wstęp Java jest to język programowania, który powstał w roku 1991. Na początku jego nazwa była inna niż obecnie, nazywał się bowiem Oak (Dąb). Jest to język programowania, którego składnia jest niezwykle podobna do innego popularnego języka programowania, czyli C++. Java jest także językiem, który jest prawie całkowicie obiektowy, co oznacza, że wszystko co się w nim znajduje jest obiektem, natomiast wyjątek od tej reguły stanowią tylko i wyłącznie zmienne. Pierwszym projektem, w którym wykorzystano język Java, był projekt zwany “Green”. Java została stworzona przez działającą do dzisiaj amerykańską firmę Sun Microsystems z Patrickiem Naughtonem oraz Jamesem Goslingiem na czele, którzy postanowili stworzyć prosty i niewielki język, który mógłby być uruchamiany na wielu platformach z różnymi parametrami.
Java – wstęp Początkowo zespół ludzi rozwijających język Java miał na celu zaprojektowanie oprogramowania do sprzętu elektronicznego. Szybko zorientowano się, że istniejące języki, takie jak C lub C++, nie nadają się do tego celu. Pomysł rozwijano i doprowadzono do stworzenia pionierskiego języka uruchamianego kodu pośredniego na wirtualnej maszynie. Pozwoliło to na uruchamianie jednego kodu na wielu urządzeniach wyposażonych w interpreter języka. Około 1993 roku World Wide Web przemieniał się z formy tekstowej prezentacji danych na graficzną i przyciągał coraz większą uwagę. Twórcy języka Java błyskawicznie zdali sobie sprawę, że ich nowostworzony język będzie idealny do aplikacji sieciowych, działających przecież na różnych komputerach. Stworzyli zatem pierwszą przeglądarkę internetową, nazwaną WebRunner. Później zmieniono nazwę na HotJava, aby zachować znak firmowy.
Java - wstęp HotJava, jako pierwsza obsługiwała applety. Była ona ważnym krokiem w rozwoju aplikacji internetowych. Internet łączy w sobie różne typy komputerów i platform systemowych. Dlatego, żeby Java działał na każdej z nich, zastosowano następujące rozwiązanie. Najpierw kompilacja tworzy nam w efekcie tzw. B–kod (kod pośredni), a następnie Java Virtual Machine (program uzależniony od konkretnej platformy systemowej) dokonuje jego interpretacji. Co prawda nadal trzeba posiadać odpowiednią dla swojego systemu operacyjnego wersję JVM, ale jest ona w większości obecnych systemów operacyjnych zaimplementowana.
Java - wstęp Pierwsza wersja Javy ukazała się w 1996 roku w wersji 1.0. Niestety nie osiągnęła ona wielkiego rozgłosu z czego inżynierowie firmy Sun dokładnie zdawali sobie sprawę. Na szczęście dosyć szybko poprawiono błędy i uzupełniono ją o nowe biblioteki, model zdarzeń GUI, a także poprawiono mechanizm refleksji. W Java 1.2, opublikowanej w 1998 roku największą zmianą była zmiana nazwy na dumnie brzmiący: Java 2 Standard Edition Development Kit version 1.2 – platforma przeznaczona głównie do standardowych zastosowań komputerów personalnych i serwerów. Opracowano wtedy także dwa inne wydania Javy, doskonale znana prawie każdemu z nas wersja Micro Edition, przeznaczona na urządzenia mobilne, oraz Enterprise Edition wykorzystywana przede wszystkim w programowaniu aplikacji klient-serwer. Kolejne edycje Javy aż do 6, to przede wszystkim dodawanie nowych funkcjonalności oraz prace nad wydajnością bibliotek standardowych.
Program w JAVIE Każdy program w Javie jest zestawem klas. Klasa jest podstawową jednostką enkapsulacji.( nie można pisać kodu poza definicją klasy) Pisany przez nas program może być zapamiętany w jednym lub wielu plikach źródłowych o rozszerzeniu „java”. Nazwa klasy powinno być zgodna z nazwą pliku, który przechowuje program.
Główne cechy języka java to: prostota bezpieczeństwo przenośność wielowątkowość neutralność architektury interpretowalność wysoka wydajność rozproszenie dynamika
Wersja tego języka (J2SE 5), wniosła wiele nowości typy sparametryzowane metadane automatyczne otaczanie i wydobywanie typów prostych wyliczenia zmienna liczba argumentów pętla for-each import statyczny formatowane wejście-wyjście unowocześnienie interfejsu programistycznego narzędzia związane ze współbieżnością
Pierwszy program – „Hello World” Programem w języku Java jest to aplikacja (application) lub aplet (applet). Aplikacja jest programem samodzielnym, zaś aplet jest programem wbudowanym (np. w przeglądarkę WWW). Każda aplikacja musi zawierać dokładnie jeden moduł źródłowy nazywany modułem głównym aplikacji, którego klasa publiczna zawiera publiczną funkcję klasy (funkcje takie są poprzedzane słowem kluczowym static) main. Tekst źródłowy najprostszego programu może mieć postać:
Pierwszy program – „Hello World” Dla skompilowania powyższego programu jego tekst źródłowy należy umieścić w pliku o nazwie Hello.java. Zakładając, że dysponujemy systemem JDK z kompilatorem javac, program skompilujemy poleceniem: javac Hello.java 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 Interpretator wyszuka plik o nazwie Hello.class, ustali, czy klasa Hello zawiera publiczną metodę statyczną main i wykona instrukcje zawarte w bloku main.
Pierwszy program – „Hello World” Public class Hello { public static void main(String args[]) { System.out.print("Hello, World!\n"); } } Oczywiście po kompilacji i uruchomieniu tego programu pojawi się na konsoli „Hello, World!” W jaki sposób?
Pierwszy program – „Hello World” Omówmy teraz składnię naszego pierwszego programu: public class Hello Jest to nic innego jak publiczna klasa o nazwie Hello, która pełni w naszym programie główny wątek.
public static void main(String args[]) Jest to metoda publiczna, gdyż musi być dostępna dla JVM do rozpoczęcia wykonywania programu. Jest to metoda statyczna, gdyż rozpoczyna wykonywanie, gdy nie istnieje jeszcze żaden obiekt. W nawiasie podane są arguemnty w postawi tablicy zmienny String, jako parametr funkcji main. Args[0] to tablica elementów typu String, która zawiera parametry, wysyłane do programu, podczas jego uruchamiania. Wartością parametru args[0] jest jest pierwszy po nazwie programu spójny ciąg znaków. Bez tej metody w głównej klasie programu (public class Hello), program nie uruchomiłby się.
Pierwszy program – „Hello World” System.out.print(„ Hello, World!\n”); Słowo System jest nazwą klasy w standardowym środowisku języka. 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 String. Kompilator automatycznie tłumaczy literał stały "Hello, World\n" na odpowiedni obiekt klasy String; odniesienie (referencja) do tego obiektu jest przekazywane do metody System.out.print(). Metoda print generuje jeden wiersz wyjściowy i powraca do metody main, która kończy wykonanie.
Pierwszy program – „Hello World” Kilka słów o argumencie metody main: public static void main(String args[]) Każda zmienna String w tablicy args[], jest nazwana argumentem z wiersza. (ang. command-line argument) Elementy tej tablicy pozwalają użytkownikowi mieć wpływ na operacje w wykonywam programie bez rekompilacji. Użytkownik ma dostęp do elementów tablicy args[] w obrębie funkcji main, może ich używać etc. Jeśli chcemy, aby nasz argument składał się z wielu słów należy go objąć cudzosłowiem. Przykład ->
Pierwszy program – „Hello World” -> public class Echo { public static void main (String[] args){ for (String s: args) { System.out.println(s); }
Podstawowa składnia języka Java posiada kilka typów zmiennych: Zmienne statyczne (ang. Static variables,claas variables) – zmienna zadeklarowana z modyfikatorem static. Jest to pole klasy wspólne dla wszystkich obiektów tej klasy np. static counter = 0; Zmienne niestatyczne (ang. Instance variables) – zmienna zadeklarowana np. w klasie, każdy obiekt posiada swój unikalny egzemplarz tego pola. Zmienne lokale – czyli po prostu zmienne, zadeklarowane w jakimś bloku kodu między klamrami {}, w bloku jakiejś metody itp. Parametry – zmienne wysłane jako argumenty do funkcji.
Nazywanie zmiennych i obiektów W Javie odróźnia się wielkie od małych liter w nazwach obiektów, zmiennych, nazw funkcji, klas itp. Można używać liter, cyfr oraz znaku ‘_’ a także ‘$’. Zaleca się, aby zmienną zawierającą jedno słowo w nazwie pisać małymi literami, jeśli nazwa składa się z kilku słów, to każde kolejne powinno być pisane z wielkiej litery. String nazwa; String dwuczlonowaNazwa; Należy pamiętać, że istnieją również zarezerwowane słowa w języku, które mają specjalne znaczenie dla kompilatora – słowa kluczowe (ang. keywords) ->
Słowa kluczowe abstract byte class continue else finally for import long new public strictfp switch throws volatile assert case const default enum float goto instanceof native package return super synchronized transient while boolean catch do extends if int in private short outer this try future break char inner double final virtual implements interface cast protected static generic throw void var
Typy zmiennych Typy podstawowe: char capitalC = 'C'; byte b = 100; byte – 8 bitowa liczba całkowita ze znakiem short - 16 bitowa liczba całkowita ze znakiem int - 32 bitowa liczba całkowita ze znakiem long - 64 bitowa liczba całkowita ze znakiem float - 32 bitowa liczba rzeczywista double - 64 bitowa liczba rzeczywista boolean - zmienna logiczna (true,false) char - zmienna znakowa Przykład: boolean result = true; char capitalC = 'C'; byte b = 100; short s = 10000; int i = 100000;
Klasy opakowujące (ang. wrapper classes) Ważnym aspektem w języku java są klasy opakowujące. Oprócz zwykłych zmiennych (np. int, double) możemy deklarować również egzemplarze klas opakowujących. Klasy opakowujące dziedziczą z klasy Number:
Klasy numeryczne (ang. wrapper classes) Typ podstawowy Klasa numeryczna byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
Klasy opakowujące (ang. wrapper classes) Obiekty tych klas reprezentują (w sposób obiektowy) dane odpowiednich typów. Np. obiektowy odpowiednik liczby 5 typu int możemy uzyskać tworząc obiekt klasy Integer: Integer a = new Integer(5); Klasy opakowujące nie dostarczają żadnych metod do wykonywania operacji na liczbach. Z obiektu takiej klasy musimy liczbę "wyciągnąć" za pomocą odpowiednich metod, np. int i = a.intValue(); Można zadać sobie pytanie po co używać takich klas? Otuż czasem przydają się nam metody z klas opakowujących, szczególnie dlatego, że zawierają szereg przydatnych konwersji.
Operatory Operator Nazwa Przykład . Selektor obiektu obiekt.nazwa_elementu [] Indeks tablicy tablica[nuner_elementu] () Wywołanie funkcji nazwa_funkcji(lista_elementów) ++ Przyrostkowy operator inkrementacji zmienna++ Przedrostkowy operator inkrementacji ++zmienna -- Przyrostkowy operator dekrementacji zmienna-- Przedrostkowy operator dekrementacji --zmienna ~ Operator uzupełnienia jedynkowego ~wyrażenie ! Operator negacji logicznej !wyrażenie instanceof Operator występowania if(obiekt instanceof nazwa_klasy) new Operator przydziału pamięci new typ_zmiennej * Operator mnożenia wyrażenie * wyrażenie
Operatory Operator Nazwa Przykład / Operator dzielenia wyrażenie / wyrażenie % Operator modulo wyrażenie % wyrażenie + Operator dodawania wyrażenie + wyrażenie - Operator odejmowania wyrażenie - wyrażenie << Operator przesunięcia w lewo wyrażenie << wyrażenie >> Operator przesunięcia w prawo wyrażenie >> wyrażenie >>> Operator przesunięcia w prawo z wypełnieniem zerami wyrażenie >>> wyrażenie < Operator mniejszości wyrażenie < wyrażenie > Operator większości wyrażenie > wyrażenie
Operatory Operator Nazwa Przykład <= Operator mniejszości lub równości wyrażenie <= wyrażenie >= Operator większości lub równości wyrażenie >= wyrażenie = = Operator równości wyrażenie = = wyrażenie != Operator nierówności wyrażenie != wyrażenie & Operator iloczynu bitowego wyrażenie & wyrażenie ^ Operator bitowej różnicy symetrycznej (XOR) wyrażenie ^ wyrażenie | Operator sumy bitowej wyrażenie | wyrażenie && Operator iloczynu logicznego (AND) wyrażenie && wyrażenie || Operator sumy logicznej (OR) wyrażenie || wyrażenie ?: Operator if - else (wyrażenie_logiczne) ? wyrażenie_true : wyrażenie_false = Operator przypisania zmienna = wyrażenie;
Instrukcje sterujące wykonywaniem programu W języku Java istnieje standardowy zestaw instrukcji umożliwiających sterowanie kolejnością wykonywania programu, podobny jak w C lub C++. Istnieje jednak kila istotnych różnic, które wynikają chociażby z innego zestawu typów dostępnego w Javie. W języku Java, jak można oczekiwać, istnieje konstrukcja if-then-else. Główną różnicą pomiędzy tą i odpowiadającą instrukcją w C jest to, że w Javie warunek musi zwracać wartość logiczną. Nie można używać zera do oznaczania fałszu lub innej wartości niż zero do oznaczania prawdy. if (boolean) { /* instukcje */ } else { /* instrukcje */ }
Pętla do while Pętle while oraz do-while są identyczne jak odpowiednie pętle w języku C (także i tutaj warunek musi zwracać wartość logiczną): while (boolean) { /* instrukcje */ } do { /* instrukje */ } while (boolean);
Pętla for Pętla for jest podobna do takiej samej pętli w C++: for (int i=0; i<10 ; i++) { /* instrukcje */ } Oczywiście zmienna zadeklarowna w pętli obejmują swym zasięgiem tylko ciało pętli for i zmienna ta nie jest widoczna poza pętlą. Odwołanie się do tej zmiennej poza pętlą byłoby więc błędem.
Instrukcja switch Składnia konstrukcji switch jest identyczna do składni w języku C: switch ( wyrażenie) { case Wartosć1 : /* ... */ break; case Wartosć2 : /* ... */ break; default : /* ... */ break; }
Instrukcje break i continue Java posiada jeszcze dwie instrukcje zmieniające przebieg wykonywania programu: break i continue, które mogą mieć argument będący etykietą. Jeśli są używane bez etykiety, to ich znaczenie jest takie samo jak w języku C. Jeśli odwołują się do etykiety, to sterowanie programu zostanie przekazane do miejsca opatrzonego etykietą. Poniższy przykład ilustruje użycie instrukcji continue z etykietą: nazewnątrz: for (int j=1; j<10; j++) { for (int i=1; i<20; i++) { if (i=15) { continue nazewnątrz; } }
Instrukcje break i continue Użycie instrukcji break może być użyteczne, jeśli używamy instrukcji switch wewnątrz pętli for, ponieważ break ma szczególne znaczenie w instrukcji switch. Dodanie etykiety pozwala wyskoczyć z instrukcji switch wewnątrz pętli for. LoopStart: for (int i=1; i<10; i++) { switch (i) { case 4 : break; default : if ((i%2) == 0) break LoopStart; break; } }
Koniec