Programowanie w Javie Literatura • podstawowa: 1. 2. 3. 4. 5. Cay S. Horstmann, Gary Cornell. Java Podstawy. Bruce Eckel. Thinking in Java. (biblioteka Wilno) Herbert Schildt. Java - Kompendium Programisty. Rogers Cadenhead. Java w 21 dni. Wydanie VII Marcin Lis. Praktyczny kurs Java. Wydanie III • materiały online: http://docs.oracle.com/javase/tutorial/ http://docs.oracle.com/javase/8/docs/api/ http://javastart.pl/static/darmowy-kurs-java/ http://naukajavy.pl/ Egzamin • egzamin pisemny bez komputerów: zestaw otwartych pytań teoretycznych • dopuszczenie do egzaminu: zaliczenie laboratorium Wykład 1: Podstawy języka Java 1. Struktura, kompilacja i uruchomienie programu 2. Typy danych, operatory, instrukcje sterujące, tablice Cechy języka Java (1) • zorientowany obiektowo język programowania • oparty na C/C++, wiele podobieństw, ale są też istotne różnice: – – – – nie ma wskaźników nie ma wielokrotnego dziedziczenia nie ma przeciążania operatorów jest automatyczne zarządzanie wykorzystaniem pamięci (garbage collector) Cel: z C/C++ usunięto mechanizmy będące przyczyną częstych błędów programistów Cechy języka Java (2) • przenośność: raz napisany program można uruchamiać na różnych urządzeniach i różnych systemach operacyjnych (hasło reklamowe: "Write once, run anywhere”) • mniejsza wydajność w porównaniu do C/C++ • obszerna biblioteka klas (API - Application Programming Interface) do programowania m.in.: – – – – interfejsu graficznego (aplikacji okienkowych) aplikacji sieciowych aplikacji korzystających z baz danych aplikacji wielowątkowych • JavaScript nie jest uproszczoną wersją Javy Pierwszy program class PierwszyProgram{ public static void main(String args[]){ System.out.println("Witamy na zajęciach"); //inne instrukcje do wykonania } } Program zapisujemy w pliku o rozszerzeniu .java • • • • • • • • klasy to opisy obiektów, nie można pisać programu poza klasą metoda main - od tej metody zaczyna się wykonanie programu metoda println wyprowadza tekst na ekran plik z kodem źródłowym trzeba nazwać tak jak nazwa klasy: PierwszyProgram.java public - modyfikator dostępu metody main (dostęp publiczny) static - nie musi być utworzony obiekt, aby użyć metody void - metoda nie zwraca wartości w sensie arytmetycznym args[] - zmienna tablicowa typu String – możliwość wywołania programu z parametrami Kompilacja i uruchomienie programu • kompilacja: javac PierwszyProgram.java • wynik kompilacji: plik z kodem pośrednim (kodem bajtowym - bytecode), a nie z kodem maszynowym czyli nie jest to plik wykonywalny: PierwszyProgram.class • uruchomienie programu: poprzez wirtualną maszynę Javy (JVM) java PierwszyProgram Kod bajtowy jest interpretowany przez wirtualną maszynę Javy (JVM) do postaci programu wykonywalnego dla danego systemu operacyjnego • Wirtualna Maszyna Javy (Java Virtual Machine): rodzaj wirtualnego (programowego) komputera , który ma swój zestaw rejestrów, zestaw instrukcji, stos i pamięć dla programów Przykład: PierwszyProgram.java Pierwszy program używając NetBeans 1. 2. 3. 4. File - New Project Z panelu "Categories" wybrać "Java". Z panelu "Projects" wybrać "JavaApplication". Next Project Name: np. PierwszyProgram Project Location: wskazać katalog, gdzie będzie przechowywany projekt Opcja "Create Class Main" powinna być zaznaczona Finish W ciele metody main wpisać: System.out.println("Witamy na zajęciach"); Uruchomienie programu: Run - Run Project Wykonanie programu: Okienko Output u dołu ekranu Utworzone katalogi: Jeśli Project Name nazwaliśmy PierwszyProgram, to tam gdzie wskazaliśmy Project Location zostanie utworzony katalog PierwszyProgram i w nim będzie przechowywany cały projekt. M.in: • • Plik źródłowy: PierwszyProgram/src/pierwszyprogram/PierwszyProgram.java Kod bajtowy: PierwszyProgram/build/classes/pierwszyprogram/PierwszyProgram.class Narzędzia programistyczne (1) Firma Oracle udostępnia bezpłatnie wszystkie narzędzia do programowania w Javie. Jeżeli chcemy pisać programy w Javie musimy zainstalować JDK - Java Development Kit. Jest to pakiet programów zawierający: – narzędzia do budowania, kompilacji i uruchamiania programu, – JRE - Java Runtime Environment czyli środowisko uruchomieniowe Javy. JRE zawiera m.in. : wirtualną maszynę Javy i biblioteki (pakiety klas standardowych) – przykłady aplikacji i apletów, – narzędzia do dokumentowania i archiwizacji programów – dokumentację JDK jest dostępne pod adresem: http://www.oracle.com/technetwork/java/javase/downloads/ Instalacja jest intuicyjna. Wykonujemy instrukcje wyświetlane na ekranie. Pakiet JDK jest dostępny na różne systemy operacyjne i jest bezpłatny Jeżeli chcemy tylko uruchamiać programy napisane w Javie wystarczy zainstalować samo JRE Narzędzia programistyczne (2) Po zainstalowaniu pakietu JDK otrzymujemy następującą strukturę katalogów: bin - programy usługowe: • javac - kompilator • java - interpreter bajtkodu (JVM) • appletviewer – przeglądarka apletów, • javadoc - generator dokumentacji, • jdb – debuger, • jar – narzędzie do tworzenia archiwów jre - środowisko uruchomieniowe: • wirtualna maszyna javy, • biblioteka klas, lib - dodatkowe biblioteki klas demo - aplety i aplikacje demonstracyjne docs - dokumentacja pakietu w postaci stron HTML. Zmienne środowiskowe, polskie znaki, edytory kodu źródłowego 1. Ustawienie zmiennych środowiskowych (Windows): – Zmienna: PATH – Wartość: sciezka_do_folderu_jdk\bin 2. Polskie znaki w konsoli Windows: – we Właściwościach konsoli zmienić czcionkę na Lucida Console – aby w konsoli była używana strona kodowa Windows 1250 wykonujemy polecenie: chcp 1250 – aby w konsoli była używana strona kodowa strona kodowa UTF-8 wykonujemy polecenie: chcp 65001 3. Tworzenie kodu źródłowego – dowolny edytor tekstu np. Notepad++ – zintegrowane środowisko programistyczne: NetBeans, Eclipse Komentarze • liniowy // to jest komentarz • blokowy /* to jest komentarz to jest ciąg dalszy komentarza*/ Typy danych • • proste: – znakowy (char). Znak jest reprezentowany przez 16 bitową liczbę. Znaki kodowane w UTF-16. – logiczny (boolean, 1 bit). Wartości: false, true. – arytmetyczny: • liczby całkowite: byte (8 bitów), zakres: od -28 do 28 -1 short (16 bitów), zakres od -216 do 216 -1 int (32 bity), zakres od -232 do 232 -1 long (64 bity), zakres od -264 do 264 -1 • rzeczywiste (zmiennopozycyjne): float (32 bity), zakres: -3,4*1038 do +3,4*1038 double (64 bity), zakres: -1,8*10308 do +1,8*10308 Uwaga: zakres liczb jest z góry ustalony, nie zależy od systemu operacyjnego na jakim uruchamiany program w Javie (32 bitowy, 64 bitowy), z jakiego kompilatora korzystamy referencyjne: String (łańcuchy), tablice, inne obiekty Deklaracje zmiennych, przypisanie wartości • • • • • • • • • • • • • int liczba; liczba = 100; int liczba = 100; int liczba1 = 100, liczba2, liczba3 = 300; double wartoscKredytu = 1.234; float wartoscKredytu = 1.234f; char znak = 'a'; boolean zaplacone = true; String miasto = "Wilno"; String miasto = new String("Wilno"); String jest obiektem a nie tablicą znaków nazwy zmiennych: duże i małe litery, cyfry, znak podkreślenia, można znaki diakrytyczne, ale się w praktyce nie stosuje nazwa zmiennej nie może zaczynać się od cyfry Kilka przykładów • int a=10,b; b = a / 4; kompilator nie zgłosi błędu. Wynik zostanie zaokrąglony w dół do liczby całkowitej. Wartość b będzie 2. • int b = 2.5; kompilator zgłosi błąd, kompilacja się nie powiedzie • byte a = 127; a += 3; Kompilator nie zgłosi błędu. Nastąpi zawinięcie liczby. Wartość a będzie -126. Przykład: Program.java Wyprowadzenie danych na ekran • metoda println po wyprowadzeniu znaków następuje przejście do nowego wiersza • metoda print przejście nie następuje • łączenie ciągów znaków (operacja konkatenacji): + • nie dzielimy ciągu znaków ujętych w cudzysłów Przykład: Program.java Wyprowadzenie znaków specjalnych nowa linia \n tabulator \t cudzysłów \” apostrof \’ backslash \\ Przykład: Program.java Operatory arytmetyczne: przypisania: + dodawanie x += y x = x + y - odejmowanie x -= y x = x - y * mnożenie x *= y x = x * y / dzielenie x /= y x = x / y % reszta z dzielenia x %= y x = x % y inkrementacja, dekrementacja: ++, -int x = 1, y = 2; x += ++y; // wartość x to 4, wartość y to 3 x += y++; // wartość x to 7, wartość y to 4 Operatory (cd) porównania: logiczne: == równe && i != różne || lub < mniejsze ! nieprawda, że > większe <= mniejsze lub równe bitowe: >= większe lub równe & AND | OR ~ NOT ^ XOR >> przesunięcie w bitów prawo << przesunięcie bitów w lewo >>> przesunięcie w prawo z wypełnieniem zerami byte a = 4; // 4 = 1002 a = a >> 1; // wartość a to 2 = 0102 Instrukcje sterujące • warunkowa if (warunek) { ... } else { ... } • wyrażenie warunkowe warunek ? wartość1 : wartość2; int a, b; ... a < b ? a += b : b += a; if (warunek1) { ... } else if (warunek2) { ... } else { ... } Instrukcje sterujące Instrukcja wyboru switch (wyrażenie) { case wartosc1: ...; break; case wartosc2: ...; break; case wartosc3: ...; break; default: ...; } • • "break" nie jest obowiązkowy, jeśli będzie pominięty to po dopasowaniu zostaną wykonane wszystkie pozostałe przypadki „default” nie jest obowiązkowe Instrukcje sterujące pętla FOR for (wyrażenie_początkowe; warunek; ... } for (int i=1;i<=10;i++) { a *= 2; } wyrażenie_modyfikujące) { przeniesienie wyrażenia początkowego i modyfikującego for (int i=1;i<=10;) { a *= 2; i++; } int i=1; for (;i<=10;) { a *= 2; i++; } Instrukcje sterujące • pętla WHILE i DO WHILE while (warunek) { ... } do { ... } while (warunek); int i = 1; while (i<=10) { a *= 2; i++; } int i = 1; do { a *= 2; i++; } while (i<=10); Instrukcje sterujące • break - przerwanie bieżącej pętli przesunięcie warunku: for (int i=1; ;i++) { a *= 2; if (i == 3) {break;} } pominięcie przebiegu pętli wewnętrznej dla i = 3: for (int i=0;i<=10;i++) { for (int j=0;j<=10;j++) { if (i == 3) {break;} ... } } Instrukcje sterujące • continue - przerwanie bieżącej iteracji i przejście do kolejnej pominięcie parzystych przebiegów: for (int i = 1; i<=10; i++) { if (i % 2 == 0) {continue;} ... } Instrukcje sterujące • etykietowanie pętli – break przerwie blok etykietowanej pętli – continue przerwie bieżącą iterację etykietowanej pętli i przejdzie do następnej iteracji etykieta: for (int i=0;i<=2;i++) { for (int j=0;j<=2;j++) { if (i ==2) break etykieta; ... } } Przykład: Program.java Tablice Tablica jest obiektem. 1. deklaracja zmiennej tablicowej typ_tablicy nazwa_tablicy[]; lub typ_tablicy[] nazwa_tablicy; int tablica[]; int[] tablica; Uwaga: powstaje tylko zmienna referencyjna, za pomocą której będziemy odwoływać się do tablicy, a nie tablica 2. utworzenie tablicy (rezerwacja pamięci) i przypisanie jej do zmiennej tablicowej zmienna_tablicowa = new typ_tablicy[liczba_elementów]; tablica tablica = new int[10]; //powstanie tablica 10-elementowa Można jednocześnie zadeklarować i utworzyć tablicę: int[] tablica = new tablica[10]; Tablice • Przypisanie wartości elementom tablicy (elementy są indeksowane od 0). nazwa_tablicy[numer_elementu]; tablica[5] = 20; //dla elementu szóstego przypisano wartość 20 • Deklaracja tablicy i utworzenie tablicy z jednoczesnym przypisaniem wartości int[] tablica = {1,2,3}; // powstanie tablica 3 elementowa, pierwszy element to 1 char[] tablica = {'a','b','c'}; // powstanie 3 elementowa tablica znaków • odwołanie się do nieistniejącego elementu tablicy Kompilator nie zgłosi błędu. Błąd (wyjątek) zgłosi maszyna wirtualna. Przykład: Program.java Tablice • rozmiar tablicy jest zapisany w polu length int[] tablica = new tablica[10]; Wypełnienie tablicy: for (int i=1;i<tablica.length;i++) { tablica[i] = 2*i; } Nowa konstrukcja w porównaniu z C/C++ pętla "foreach", przebiega elementy tablicy a nie indeksy: for (int i:tablica) { System.out.println(i); } Powyższa pętla wypisze elementy tablicy Tablice wielowymiarowe 1. deklaracja zmiennej tablicowej int tablica[][]; lub int[][] tablica; 2. utworzenie tablicy i przypisanie jej do zmiennej tablicowej tablica = new int[10][5]; //powstanie tablica 10x5 Można łącznie: int[][] tablica = new int[10][5]; • • odwołanie się do elementu tablicy. tablica[0][0] = 20; //dla elementu (0,0) przypisano 20 inny sposób przypisania wartości elementom tablicy int[][] tablica = {{1,2,3},{4,5,6}}; // powstanie tablica 2x3 0 1 2 0 1 2 3 1 4 5 6 Tablice wielowymiarowe 1. tablica dwuwymiarowa to tablica jednowymiarowa, której elementami są tablice jednowymiarowe 2. pole length int[][] tablica = {{1,2,3},{4,5,6}}; Pole tablica.length ma wartość 2, bo tablica ma 2 elementy, które są tablicami, pierwszy to tablica z elementami 1,2,3, drugi to tablica z elementami 4,5,6 Pole tablica[0].length ma wartość 3, bo tablica[0] jest tablicą składającą się z trzech elementów: 1,2,3 Pole tablica[1].length ma wartość 3, bo tablica[1] jest tablicą składającą się z trzech elementów: 4,5,6 3. wypełnienie tablicy dwuwymiarowej z użyciem pola length int[][] tablica = new int[2][3]; int k=1; for (int i=0;i<tablica.length;i++) { for (int j=0;j<tablica[i].length;j++) { tablica[i][j] = k; k++; } } Tablice wielowymiarowe-nieregularne 0 1 0 1 2 1 3 4 2 6 2 2-elementowa tablica 5 3-elementowa tablica 1-elementowa tablica int[][] tablica = new int[3][]; //potrzebuję 3 tablic tablica[0]=new int[2]; tablica[1]=new int[3]; tablica[2]=new int[1]; int k=1; for (int i=0;i<tablica.length;i++) { for (int j=0;j<tablica[i].length;j++) { tablica[i][j] = k; k++; } } Trochę historii • 1991 - zespół Sun Microsystems projektuje język o nazwie Oak (Dąb), później (1995) przemianowany na Java Motywacja: język do tworzenia niezależnego od platformy sprzętowo-systemowej oprogramowania do sterowania urządzeniami elektronicznymi np. kuchenkami mikrofalowymi, pilotami do zdalnego sterowania. Trochę historii (cd) • 1995 - Język Java zyskał na popularności dopiero wraz z rozwojem internetu i WWW. Pokaz na SunWorld ’95: napisana w Javie przeglądarka HotJava. Obsługiwała programy osadzone na stronie www (aplety) • 1996 - wersja 1.0, bardzo ograniczone możliwości • 1998 - wersja 1.2 (nazwa nadana przez dział marketingu: Java 2 Standard Edition - J2SE), biblioteka do tworzenia interfejsu graficznego Trochę historii (cd) • 1999 - oddzielne edycje Javy: – J2EE (Enterprise Edition) - platforma przeznaczona głównie do tworzenia rozbudowanych i zaawansowanych aplikacji biznesowych opartych na architekturze wielowarstwowej (aplikacje serwerowe). – J2ME (Micro Edition) - uproszczona wersja platformy Javy do programowania urządzeń elektronicznych o bardzo ograniczonych zasobach, takich jak telefony komórkowe. • 2006 - Sun udostępnia Javę na zasadzie wolnego oprogramowania - licencja GNU GPL; wersja Java SE 6 (rezygnacja z nazewnictwa Java2 SE) • 2009 - Oracle wykupuje Sun • najnowsza wersja: Java SE 8