Krótka historia Java Green Project (1991) Sun Microsystems Pierwotna nazwa: Oak W trakcie projektowania zmieniona na: Java Pierwsze publiczne wydanie 1995 Write Once, Run Anywhere
Co jest potrzebne? http://java.oracle.com Java SE (Standard Edition) obecnie wersja 8u65/66 JDK (Java Development Kit) wieloplatformowe (windows, linux, mac, solaris) Kompilator: javac, wirtualna maszyna: java IDE (najpopularniejsze: http://eclipse.org) Wieloplatformowa nakładka stworzona z myślą wspierania programowania w Języku JAVA, oraz wielu innych (obecna wersja neon ) Należy pobrać właściwą wersję instalacyjną (OS, 32- lub 64-bit)
Niezależność od platformy JAVA COMPILER (translator) JAVA BYTE CODE (ten sam dla wszystkich platform) JAVA INTERPRETER (na każdym z systemów) Windows Macintosh Solaris Linux
JAVA język kompilowany i interpretowany programista urządzenie + system operacyjny Kod źródłowy Kod bajtowy edytor kompilator interpreter plik.java plik.class notatnik, emacs, vi, eclipse javac java appletviewer przeglądarka
Architektura neutralna i przenośna Kompilator Java działa na kodzie źródłowym (pliki z rozszerzeniem.java) javac MojaKlasa.java Tworzy plik z kodem bajtowym, wykorzystywanym przez maszynę wirtualną java MojaKlasa.class Interpreter jest zależny od konkretnego środowiska i on decyduje jak zostanie wykonany ten sam kod bajtowy. Można rozwijać dwa rodzaje programów Java: - samodzielne aplikacje - interpreter - aplikacje webowe (aplety) przeglądarka z interpreterem
Java pierwszy program wszystko jest obiektem samodzielny program musi mieć funkcję main
Java argumenty i ich liczba
Java zarządzanie pamięcią Java zarządza pamięcią automatycznie GC (Garbage Collector) odśmiecacz jest częścią JVM i działa zwykle jako niezależny wątek, jest procesem bardzo autonomicznym Zmienne Javy tworzone na stercie Dopóki jest jakieś powiązanie z obiektem, nie zostaje on usunięty Gdy wszystkie dowiązania do obiektu się kończą, może on być skasowany przez GC Zmienne lokalne funkcji lub bloku kodu kończą się wraz z wykonaniem funkcji, wyjściem z bloku Można też ustawić zmienną na null (wtedy jej zasób kwalifikuje się dla GC)
Każda klasa w osobnym pliku. Klasy i obiekty
Wszystko jest obiektem Funkcjonalnie to samo: Zamiana tablicy znaków w obiekt String Można zrobić odwrotne przekształcenie
Typy zmiennych w Java Zmienne proste: - Wielkości numeryczne (całkowite i zmiennoprzecinkowe) - Pojedyncze znaki (characters) - Zmienne logiczne (true/false) Zmienne złożone: - Strings - Dates - cokolwiek - klasy: nazwa z wielkiej litery - zmienna: nazwa z małej litery
Proste zmienne i konwersje Zmienne i ich zakresy oraz... klasy pomocnicze: Wykonujemy konwersję poprzez stworzenie obiektu i metody: Brak inicjalizacji prostej zmiennej domyślna wartość 0.
Problemy z precyzją Na wyjściu: 1115.3699999999998908606357872486114501953125 dołączamy odpowiednią bibliotekę (Eclipse potrafi nas o tym poinformować) Na wyjściu: Wartosc to 1115.37
Konwersja stratna i przekręcanie licznika (rzutowanie)
Operatory Java ma bardzo podobne operatory jak inne języki (np. C lub C++). Są jednak ciekawostki: Jest też wersja: equalsignorecase Trzeba też uważać, co się porównuje (po lewej obiekty, a nie ich zawartość).
Zmienne znakowe char klasa pomocnicza Klasy pomocnicze dostarczają szereg użytecznych funkcji statycznych (takich, które można wołać za pomocą klasy, bez konieczności tworzenia obiektu klasy).
Zmienne logiczne (boolean) klasa pomocnicza }
Drukowanie na ekranie różnych zmiennych Zmienne prostych typów korzystają z metody tostring (w klasie pomocniczej).
Czytanie zmiennych Czytanie odbywa się w tej funkcji. Ponadto Java obsługuje wyjątki.
Kopiowanie pliku bajt po bajcie Czytanie i zapis wykonamy na porcjach 1024 bajtów oraz z użyciem obiektów FileInputStream oraz FileOutputStream Bloki try { } catch ( ) { } to obsługa sytuacji wyjątkowych. Zostaną omówione dalej.
Struktury warunkowe switch Logika działania switch taka sama jak np. w C++ ale dodatkowo kluczem może być zmienna typu String.
Warto używać enum enum (typ wyliczeniowy) podobnie jak w innych językach:
Różnego rodzaju pętle (for, while)
Refaktoryzacja
Prosty kalkulator Za chwilę to proste działanie (dodawanie) zamienimy automatycznie na funkcję. Przy okazji: Funkcje mogą mieć dowolną liczbę argumentów (tego samego typu).
Prosty kalkulator refaktoryzujemy kilka działań Uwaga nt sposobu przekazywania parametrów do wnętrza funkcji: - proste typy są przekazywane przez kopię - złożone typy (np. tablice) są przekazywane przez referencję - String przez kopię
Szybkie definiowanie metod Eclipse bardzo ułatwia pisanie kodu, tam gdzie brakuje definicji jakiejś metody, proponuje rozwiązanie i utworzenie szkieletu brakującej funkcji. Dzięki temu nudne operacje pisania kodu są dla nas wykonane, a my możemy skupić się na zawartości!
Obiekty String są niezmienialne, więc Uwaga: Jest też StringBuffer (adekwatny w przypadku środowiska wielowątkowego). Kilka użytecznych operacji na łańcuchach znakowych typu String
Kilka manipulacji z datami i formatami Korzystajmy z podpowiedzi Eclipse, który wskazuje jakie pakiety muszą być (na początku) dołączone.
Tablice
Refaktoryzacja kodu kilka klas import java.io.*; public class Calculator2 { public static void main(string[] args) { String s1 = getinput("enter a numeric value: "); String s2 = getinput("enter a numeric value: "); String op = getinput("enter 1=Add, 2=Subtract, 3=Multiply, 4=Divide"); int opint = Integer.parseInt(op); double result = 0; switch (opint) { case 1: case 2: case 3: case 4: default: incorrect value"); } result = addvalues(s1, s2); break; result = subtractvalues(s1, s2); break; result = multiplyvalues(s1, s2); break; result = dividevalues(s1, s2); break; System.out.println("You entered an return; private static double multiplyvalues(string s1, String s2) { double d1 = Double.parseDouble(s1); double d2 = Double.parseDouble(s2); double result = d1 * d2; return result; } private static double subtractvalues(string s1, String s2) { double d1 = Double.parseDouble(s1); double d2 = Double.parseDouble(s2); double result = d1 - d2; return result; } private static double addvalues(string s1, String s2) throws NumberFormatException { double d1 = Double.parseDouble(s1); double d2 = Double.parseDouble(s2); double result = d1 + d2; return result; } private static String getinput(string prompt) { BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.print(prompt); System.out.flush(); System.out.println("The answer is " + result); } private static double dividevalues(string s1, String s2) { double d1 = Double.parseDouble(s1); double d2 = Double.parseDouble(s2); double result = d1 / d2; return result; } } } try { return stdin.readline(); } catch (Exception e) { return "Error: " + e.getmessage(); }
Tworzymy dodatkowe klasy Tworzymy klasę MathOp i przenosimy do niej (copy/paste z zamianą private na public) metody. Następnie odpowiednio modyfikujemy kod w klasie podstawowej.
Tworzymy dodatkowe klasy Tworzymy klasę InputOp i przenosimy do niej (copy/paste z zamianą private na public) metodę GetInput, zmieniamy kod w klasie Hello. Odpowiednie import w pliku InputOp pojawią się same. W pliku Hello.java można usunąć (uporządkować) niepotrzebne import: Ctrl+Shift+O (Organize imports).
Obsługa błędów - wyjątki Dwa rodzaje błędów błędy kompilacji (składniowe) i błędy wykonania. Gdy nastąpi ten drugi błąd, w Java tworzony jest obiekt wyjątku, który można przechwycić i obsłużyć. Powyższy program powoduje wyjście indeksu tablicy poza zakres.
Obsługa błędów wyjątki dodajemy blok try / catch
Obsługa błędów wyjątki obsługa Z informacji drukowanej widać, że program dalej działa, że metoda printstacktrace() drukuje użyteczną informację i np. można podmienić ogólny typ wyjątku Exception na szczegółowy np. ArrayIndexOutOfBoundsException Oczywiście programista musi sam usunąć błąd (niepoprawne działanie programu, wyjście indeksu poza zakres tablicy!)
Obsługa błędów wyjątki deklaracja Zróbmy małą refaktoryzację kodu, wydzielając metodę i deklarując, jaki rodzaj wyjątku może ona zgłosić. Eclipse znacząco pomaga w wyborze (Ctrl+Spacja). Potem zaznaczamy metodę getarrayindex i opakowujemy w try/catch (Alt+Shift+Z).
Pakiety Pakiety fizycznie są podkatalogami. Dobrze jest organizować kod w ten sposób, że tworzymy Przemyślaną strukturę pakietów. Zmodyfikujemy teraz nasz kod kalkulatora, w którym były 3 klasy, tworząc nowy pakiet i robiąc refaktoryzację (Alt+Shift+T) lub od razu (przenosząc) (Alt+Shift+V) do nowego pakietu. Każda klasa w pakiecie innymi niż domyślny (default) wymaga deklaracji w jakim pakiecie się znajduje, np. W głównym programie też muszą się pojawić wtedy odpowiednie import (Eclipse wstawia je automatycznie za pomocą Ctrl+Shift+O)
Przykład programu z klasami, składowymi, metodami Rozwińmy klasę Osoba i zobaczmy jak prosto dodać funkcje typu get i set : W Java nie ma const jest za to final.
Przykład programu klasa Osoba i Klasa
Przykład programu główny program Zwróćmy uwagę na to, jak Eclipse sprawnie dodaje / zmienia potrzebne import
Dziedziczenie i polimorfizm Język Java pozwala na pojedyncze dziedziczenie. Na klasę nadrzędną mówi się zwykle superclass, a na klasę dziedziczącą subclass. Polimorfizm działa podobnie jak w C++. Warto metodę z klasy bazowej oznaczyć @Override pisząc jej wersję specjalizowaną w klasie potomnej.
Aplety Aplety to programy Java ale wykonywane w JVM w przeglądarce (najczęściej webowej). Analogiczny przykład: http://journals.ecs.soton.ac.uk/java/tutorial/getstarted/applet/ W sieci można znaleźć tysiące samouczków, dzięki którym można rozwinąć i pogłębić swoją wiedzę na temat programowania. Najbardziej efektywnym sposobem jest zdobywanie doświadczenia, poprzez nieustanne wprawki, ćwiczenia samodzielne pisanie kodu. P o w o d z e n i a!