Przygotował: Jacek Sroka 1 Programowanie obiektowe Wykład 3 Java podstawy
Przygotował: Jacek Sroka 2 Przypomnienie Analiza, projektowanie, programowanie, testowanie, wdrażanie Iteracyjnie vs kaskadowo UML Tylko notacja Ułatwia się komunikować Myślenie obiektowe Mniejsza luka reprezentacji Łatwiej zapanować nad złożonością (łatwiej dobrze programować)
Przygotował: Jacek Sroka 3 Przypomnienie c.d. Program = zbiór obiektów Obiekty łączą stan i zachowanie Obiekty zlecają sobie nawzajem pewne odpowiedzialności Posiadanie młotka nie uczyni z ciebie architekta
Przygotował: Jacek Sroka 4 Co dalej Wprowadzenie do Javy Podstawowe konstrukcje języka Uruchamianie programów JVM, JRE, JDK,...
Przygotował: Jacek Sroka 5 Język Java Wysokopoziomowy Kompilowalny Obiektowy Z silną kontrolą typów Składnia wzorowana na C/C++ Bezpieczniejszy (w pewnym stopniu chroni przed głupotą) Przenośny write once run anywhere vs write once debug everywhere "compile once, run anywhere vs "write once, compile anywhere
Przygotował: Jacek Sroka 6 Bajtkod Kompilator nie generuje kodu maszynowego, ale kod pośredni (bajtkod) Bajtkod wykonuje maszyna wirtualna Javy (Java Virtual Machine JVM) Obecnie również inne języki (Scala, Python, Groovy, Ruby, Ada, PHP,...) JMV + standard class libraries = JRE JRE to Java Runtime Environment Standardowe biblioteki implementują Java API (Application Programming Interface) Java SE 7 Oak J2SE 1.4.2 i 5.0 SE, ME, EE
Przygotował: Jacek Sroka 7 Klasy vs obiekty Program to kolekcja obiektów Obiekty są egzemplarzami klas, a klasy są ich typami Typami są też interfejsy Klasa łączy definicję struktury danych ( rekordu ) oraz operacje na tej strukturze Jak JVM napotyka słowo kluczowe new, to tworzy obiekt/egzemplarz mający swój własny stan
Przygotował: Jacek Sroka 8 Witaj Świecie public class HelloWorld { public static void main(string[] args) { System.out.println("Hello world!"); //HelloWorld hw = new HelloWorld(); } } Definicja klasy Modyfikatory dostępu Definicja metody Typ zwrotny Lista parametrów (rozdzielana przecinkiem, najpierw typ potem nazwa) Ciało Składowe klasowe vs egzemplarza Wywołanie metody
Przygotował: Jacek Sroka 9 Uruchamianie Klasa publiczna musi być w pliku o tej samej nazwie Tylko jedna klasa publiczna w pliku W IDE Shift+F6 vs F6 Ctrl+Shift+F5 vs Ctrl+F5 Ctrl+spacja Alt+Shift+F Z konsoli javac java
Przygotował: Jacek Sroka 10 Klasy Wersja minimalistyczna class Pusta { } Atrybuty class Osoba { String imię = "Jan"; String nazwisko; } Metody class Osoba { String imię; String nazwisko; String getimię(){ return imię; } String getnazwisko(){ return nazwisko; } void nicnierobi() {} } Klasa publiczna tylko w pliku o tej samej nazwie (może mieć metodę main())
Przygotował: Jacek Sroka 11 Komentarze Jednowierszowe // To jest komentarz jednowierszowy Wielowierszowe /* To jest komentarz wielowierszowy */ /* A */ /* to */ /* kilka */ /* takich */ /* komentarzy */ int x = /* ala ma kota */ 2; /* To jest komentarz /* to nadal jest komentarz */ a_to_już_nie */ Javadoc /** * Sets the tool tip text. * * @param text the text of the tool tip */
Przygotował: Jacek Sroka 12
Przygotował: Jacek Sroka 13 Identyfikatory Zaczynają się od litery a potem litery lub cyfry Znak "_" jest traktowany jako litera Znak "$ też ale jest zarezerwowany Programy w Javie to napisy w Unicode identyfikatory mogą zawierać znaki narodowe (w tym polskie) Nie ma ograniczenia na długość identyfikatorów Identyfikatory nie mogą być słowami kluczowymi Javy ani literałami true, false i null
Przygotował: Jacek Sroka 14 ćwiczenie Wskaż poprawne deklaracje zmiennej int e#; int.f; int _a; int $c; int -d; int 2_w; int _$; int 7g; int bardzo_długi_i_opisowy_identyfikator; int :b;
Przygotował: Jacek Sroka 15 Ćwiczenie Wskaż poprawne deklaracje zmiennej int e#; int.f; int _a; int $c; int -d; int 2_w; int _$; int 7g; int bardzo_długi_i_opisowy_identyfikator; int :b;
Przygotował: Jacek Sroka 16 Słowa kluczowe abstract continue for new switch assert 1.4 default if package synchronized boolean do goto private instanceof break double throw protected implements byte else import public throws this case enum 1.5 return transient catch extends int short interface char final try static void class finally long strictfp volatile const float native super while
Przygotował: Jacek Sroka 17 Konwencje Klasy i interfejsy camel case wielką literą Student, PracownikNaukowy Metody, atrybuty, zmienne camel case małą literą wiek, liczbadyplomów Stałe MAX_LICZBA_NIEZALICZEŃ JavaBeans public int getwiek() public void setwiek(int) public boolean iswieczorowy() atrybuty mogą mieć inne nazwy lub może ich nie być
Przygotował: Jacek Sroka 18 Typy 8+1 typów podstawowych Obiekty wskazywane przez referencję (16 bajtów obiekt, 8 bajtów referencja, 8 bajtów klasy wewnętrzne) Dla typów podstawowych są klasy opakowujące Wartości typów podstawowych przechowywane są na stosie, obiekty na stercie Tablice są obiektami (24 bajty) Przy adresacji 64 bitowej zaokrąglamy do 8 bajtów
Przygotował: Jacek Sroka 19 Typy Każda zmienna, atrybut, parametr ma zadeklarowany typ Kompilator sprawdza czy typy wyrażeń się zgadzają Typy pierwotne boolean byte, short, int, long, char float, double Typy referencyjne Klasy Interfejsy Tablice Obiekty = egzemplarze klas lub tablice
Przygotował: Jacek Sroka 20 Typy podstawowe
Przygotował: Jacek Sroka 21 Pamięć przykład public class Test { private int count; private Test innytest; private int[] sz; } //16 bajtów obiekt //4 bajty integer //8 bajtów referencja + ew. Test //8 bajtów referencja + ew. 24 tablica i 4*dł //+ew. uzupełnienie do wielokrotności 64bitów
Przygotował: Jacek Sroka 22 Zmienne zmienne klasowe zmienne egzemplarzowe zmienne lokalne elementy tablic (te zmienne są anonimowe) parametry metod parametry konstruktorów parametry obsługi wyjątków Zmienne lokalne trzeba samemu zainicjować przed użyciem! Maszyna wirtualna operuje wartościami int oraz double byte b = 1b; byte b = 1B; byte b = (byte) 1;
Przygotował: Jacek Sroka 23 Wartości domyślne
Przygotował: Jacek Sroka 24 Literały liczby całkowite (np. 13 czy -2627) dziesiętne, szesnastkowe (0xC) lub ósemkowe (np. 015) od Java 7 również binarne (0b00100001 lub 0B00100001) od Javy 7 możliwy czytelniejszy zapis 11_555_555 lub 0xCAFE_BABE liczby rzeczywiste (np. 1.0 czy -4.9e12) mogą być dziesiętne, szesnastkowe lub binarne np. 0Xf.aP1F; // (15 + 10/16) * 2^1 = 31.25 //szesnastkowo p zamiast e literały logiczne false i true literały znakowe (np. 'a', '\n' czy '\u004e') to 16bitowe liczby bez znaku literały napisowe (np. "Ala ma kota") obiekt String a nie typ pierwotny literały tablicowe literał null
Przygotował: Jacek Sroka 25 Operatory (i priorytety) Postfix: expr++ expr-- Unary: ++expr --expr +expr -expr ~! Multiplicative * / % Additive + - Shift << >> >>> //dla >> uzupełniamy zgodnie ze znakiem Relational < > <= >= instanceof Equality ==!= Bitwise AND & bitwise exclusive OR ^ bitwise inclusive OR Logical AND && Logical OR Ternary? : Assignment = += -= *= /= %= &= ^= = <<= >>= >>>=
Przygotował: Jacek Sroka 26 Porównania przykład class GuessAnimal { public static void main(string[] args) { String animal = "unknown"; int weight = 700; char sex = 'm'; double colorwavelength = 1.630; if (weight >= 500) { animal = "elephant"; } if (colorwavelength > 1.621) { animal = "gray " + animal; } if (sex <= 'f') { animal = "famale " + animal; } //kody Unicode System.out.println("The animal is a " + animal); } } The animal is a gray elephant
Przygotował: Jacek Sroka 27 Porównywanie Porównywać można liczby znaki wartości logiczne referencje "Ala" == "Ala" //to akurat nie jest takie oczywiste "Ala".equals("Ala"); Uwaga dla programistów C int x = 1; if (x = 0) {} //nie skompiluje się Jednak boolean b = false; if (b = true) { System.out.println("To się wypisze!!!"); }
Przygotował: Jacek Sroka 28 Jeszcze trochę priorytetów Jak wyliczy się? x *= 2 + 5; x = (x*2) + 5; //mnożenie ponad dodawanie x = x * (2+5); //nawias po prawej stronie
Przygotował: Jacek Sroka 29 Jeszcze trochę priorytetów Jak wyliczy się? x *= 2 + 5; x = (x*2) + 5; //mnożenie ponad dodawanie x = x * (2+5); //nawias po prawej stronie A jak wyliczy się? x = y++ + ++x/z;
Przygotował: Jacek Sroka 30 Ćwiczenia ćwiczenie: spróbujmy wypisać referencję (co zrobić żeby działało?) int x, y, z; z = 3; x = y = z; "Ala"+1+2+3; String s = "Ala"; s += 1; s += 2; s += 3; ""+1+2+3;
Przygotował: Jacek Sroka 31 Instrukcje c.d. instrukcja asercji assert i>0; assert i>=0: "i (" + i + ") mniejsze od zera"; instrukcja wyboru (od Java 7 również dla napisów!) switch (i){ default: System.out.println("Wartość spoza zakresu"); break; // Tak, nie musi być ostatnia! case 1: case 2: System.out.println("Dodatnie"); break; case -1: case -2: System.out.println("Ujemne"); break; case 0: System.out.println("Zero"); break; }//etykiety określają jak zorganizować skoki w bytecodzie pętla dopóki while (i>0) i--; pętla wykonuj do i++; while ( i < 0 ); pętla dla (wersja podstawowa) for (int j = 0; j<tab.length; j++) tab[j] = 0; pętla dla (wersja rozszerzona) for (int elt: tab) System.out.print(elt+", ");
Przygotował: Jacek Sroka 32 Instrukcje instruckja pusta ; instrukcja deklaracji zmiennej lokalnej int j = 13; int[] tab = new int[10]; instrukcja etykietowana koniec: return 0; instrukcja wyrażeniowa i = 0; o.wypisz(i); instrukcja warunkowa if (i > 0) i--; if (i > j) max = i; else max = j;
Przygotował: Jacek Sroka 33 Instrukcje c.d. instrukcja break break; break dalej; instrukcja continue continue; continue dalej; instrukcja powrotu return; return 0; instrukcja zgłoszenia wyjątku throw new Wyjątek(); instrukcja synchronizująca (zagadnienia współbieżności pomijamy)
Przygotował: Jacek Sroka 34 Instrukcje c.d. instrukcja try try { i = j/k; } catch (Exception e) { System.out.println("Dzielenie przez zero"); } finally { System.out.println("Kończymy"); } instrukcja bloku (umożliwia deklarowanie zmiennych lokalnych, a także klas lokalnych), np. { int i = 1; i++; int j = i + 1; return i+j; }
Przygotował: Jacek Sroka 35 Tablice Tablice są obiektami wobec czego są przechowywane na stercie Referencję do tablicy deklarujemy podając typ przechowywanego elementu oraz dodając parę nawiasów kwadratowych po dowolnej stronie identyfikatora: int[] tab; int []tab; int tab[]; int tab []; (który sposób jest najbardziej czytelny?) int[] tab1, tab2; //dwie tablice int tab1[], tab2; //tablica i liczba Tablice mogą być wielowymiarowe: String[][] tabliczka[]; Podczas deklaracji referencji do tablicy nigdy nie podajemy jej rozmiaru! Rozmiar podajemy dopiero tworząc nowy obiekt: int[] tab = new int[5]; String[][] tabliczka = new String[3][5];
Przygotował: Jacek Sroka 36 Tablice c.d. Tablice wielowymiarowe są tak naprawdę tablicami tablic: String[][] tabliczka = new String[2][]; tabliczka[0] = new String[3]; tabliczka[1] = new String[5]; Literałów tablic wolno używać jedynie w miejscu deklaracji: int[] tab = {1, 2, 3,}; //ostatni "," jest opcjonalny String s = "ela"; String[] t = {"ala", "ola", s, new String("ula")}; String[][] tabliczka = {t, {"ala"}}; W pozostałej części kodu można używać tablic anonimowych: int[] tab; tab = new int[] {1, 2, 3,}; //nadal nie podajemy rozmiaru mojafunkcja(new int[] {1, 2, 3,});
Przygotował: Jacek Sroka 37 Tablice c.d. Tablice indeksujemy zaczynając od zera: tab[0] == 1; t[3].equals("ula"); tabliczka[1][4] == null; //jest automatyczna inicjalizacja //"][" nie można zastąpić "," (tabliczka[1,4]) Tablice mają atrybut length Próba odwołania się poza zakres dostępnych indeksów spowoduje wystąpienie wyjątku ArrayIndexOutOfBoundsException java.util.arrays equals() oraz deepequals() tostring() oraz deeptostring() kopiowanie wyszukiwanie binarne, sortowanie hashcode na podstawie zawartości
Przygotował: Jacek Sroka 38 Jak działa wyszukiwanie binarne? java.util.arrays.binarysearch() 1: public static int binarysearch(int[] a, int key) { 2: int low = 0; 3: int high = a.length - 1; 4: 5: while (low <= high) { 6: int mid = (low + high) / 2; 7: int midval = a[mid]; 8: 9: if (midval < key) 10: low = mid + 1; 11: else if (midval > key) 12: high = mid - 1; 13: else 14: return mid; // key found 15: } 16: return -(low + 1); // key not found. 17: }
Przygotował: Jacek Sroka 39 Jak działa wyszukiwanie binarne? java.util.arrays.binarysearch() 1: public static int binarysearch(int[] a, int key) { 2: int low = 0; 3: int high = a.length - 1; 4: 5: while (low <= high) { 6: int mid = (low + high) / 2; 7: int midval = a[mid]; 8: 9: if (midval < key) 10: low = mid + 1 11: else if (midval > key) 12: high = mid - 1; 13: else 14: return mid; // key found 15: } 16: return -(low + 1); // key not found. 17: } Jak powinno być: 6: int mid = low + ((high - low) / 2); 6: int mid = (low + high) >>> 1;
Przygotował: Jacek Sroka 40 Konstruktor Nazwa taka sama jak nazwa klasy (można przeciążać) Brak typu zwrotnego (nie ma sensu) Zadbajmy, żeby atrybuty osoby nie mogły mieć wartości null class Osoba { String imię; String nazwisko; Osoba(String imię, String nazwisko){ this.imię = imię; //niedozwolone dla metod static this.nazwisko = nazwisko; } } String getimię(){ return imię; } String getnazwisko(){ return nazwisko; } Domyślny konstruktor bezparametrowy Pierwszą operacją może być wywołanie innego konstr. ale bez cykli this(...); super(...);
Przygotował: Jacek Sroka 41 Tworzenie obiektów Każdy obiekt jest inicjalizowany przez wykonanie jakiegoś konstruktora Operator new //Po dodaniu konstr. z param. powoduje błąd kompilacji Osoba o = new Osoba(); //Poprawne Osoba o = new Osoba("Jan","Kowalski");
Przygotował: Jacek Sroka 42 Kapsułkowanie Kontrolowanie inicjalizacji nie wystarcza do zachowania spójności Co nam grozi? Osoba o = new Osoba("Jan","Kowalski"); // o.imię = null; o.nazwisko = null; Chcemy żeby obiekty były hermetycznymi kapsułkami