Wykład 2
Transkrypt
Wykład 2
Wykład 3: Sterowanie 1.wprowadzenie 8.obsługa błędów 2.podstawy języka 9.kolekcje obiektów 3.sterowanie 10.wejście i wyjście 4.inicjacja i sprzątanie 11.równoległość 5.kontrola dostępu 12.interfejs graficzny 6.dziedziczenie 13.programy sieciowe 7.polimorfizm 14.obsługa baz danych 15.obsługa serwerów Wykład 3: Zagadnienia Manipulacja danych i kontrola sterowania: operatory w Javie ● instrukcje sterowania wykonaniem ● Konstrukcje wzorowane na C++. Operatory 1.przypisania 7.bitowe 2.matematyczne 8.przesunięcia 3.zwiększania 9.if-else 4.zmniejszania 10.przecinek 5.relacji 11.łańcuchowy plus 6.logiczne 12.rzutowania Operatory: Obliczenie Operator pobiera jeden lub więcej argumentów i zwraca wynik obliczony na ich podstawie. Obliczenie przez operator: s + “ i spolka” Obliczenie przez wywołanie metody: s.concat(“ i spolka”) Operatory: Efekt Uboczny Operator może zmienić wartość swych argumentów. s = new String(“test”); Nazywane to jest efektem ubocznym. Operatory: Stosowanie Typy podstawowe i + 2 Wszystkie obiekty o1=o2, o1==o2, o1!=o2 String s+” i spolka”, s+=” i spolka” Operatory Przypisania Przypisanie zmienna = wartosc; Weź wartość i skopiuj ją do zmiennej. Wartość może być: stałą – zmienną – wyrażeniem – Przypisanie: Typy Podstawowe Przypisanie typów podstawowych: int a; int b; a = b; Następuje proste kopiowanie zawartości. Przypisanie Obiektów Powoduje kopiowanie odwołań: class Number { int i; } Number n1 = new Number(); Number n2 = new Number(); n1.i = 9; // n1.i==9 n1 = n2; n2.i = 10; // n1.i==10 Wywołanie Metod Podobny efekt daje wywołanie metody: class Number { int i; } static void f(Number n) { n.i = 1; } Number m = new Number(); m.i = 2; //m.i==2 f(m); //m.i==1 Operatory Matematyczne Działania arytmetyczne: dodawanie, odejmowanie, dzielenie, mnożenie, modulo. Zapis skrócony, operatory unarne: x = x + 2; x += 2; x = -2; x = x – 2; x -= 2; x = +2; x = x / 2; x /= 2; x = x * 2; x *= 2; x = x % 2; x %= 2; Operatory Zwiększania pre-incrementacja: operacja potem wynik int i = 2; j = ++i; // i==3 && j==3 post-incrementacja: wynik potem operacja int i = 2; j = i++; // i==3 && j==2 Operatory Zmniejszania pre-decrementacja: operacja potem wynik int i = 2; j = --i; // i==1 && j==1 post-decrementacja: wynik potem operacja int i = 2; j = i--; // i==1 && j==2 Operatory Relacji Operatory relacji służą porównaniu wartości operandów. Zwracają boolean. x < 2 x > 2 x <= 2 x >= 2 x == 2 x != 2 Równość Obiektów: Odwołania Porównanie dwóch obiektów to porównanie odwołań do nich. Integer n1 = new Integer(2); Integer n2 = new Integer(2); System.out.println(n1 == n2);//false System.out.println(n1 != n2);//true Równość Obiektów: Wartość Porównanie wartości dwóch obiektów: Integer n1 = new Integer(2); Integer n2 = new Integer(2); System.out.println(n1.equals(n2)); equals() zdefiniowana jest dla wszystkich obiektów, ale nie dla typów podstawowych. Równość Obiektów: Wartość Porównanie wartości dwóch obiektów: class Value { int i; public boolean equals(Value v) { i == v.i } } Value n1 = new Value(2); Value n2 = new Value(2); System.out.println(n1.equals(n2)); Operatory Logiczne Koniunkcja, alternatywa, negacja. boolean b = true; int i = 2; b && (i > 2) //false b || (i > 2) //true !(i >= 2) //false Tylko do argumentów typu logicznego. Skracanie Obliczenia Ustalenie wartości operacji logicznej tylko na podstawie pierwszego argumentu. boolean b1 = false; int i = 2; b && ((i = 1) > 0) //false, i == 2 !b || ((i = 1) > 0)//true, i == 2 Operatory Bitowe Manipulowanie pojedynczymi bitami argumentów całkowitych. int i = 1; i & 5 // 0001 & 0101 == 0001 == 1 i | 6 // 0001 | 0110 == 0111 == 7 i ^ 3 // 0001 ^ 0011 == 0010 == 2 ~i // ~0001 == 11...10 Operatory Przesunięcia Przesunięcie operatora po lewej stronie przez liczbę bitów daną przez operator po prawej. int i = 2; i << 2 // 0010 << 2 == 1000 == 8 i >> 1 // 0010 >> 1 == 0001 == 1 -i >> 1 // 0010 >> 1 == 1...1 Przesunięcie w prawo używa rozszerzania znaku: 0 wstawiane dla dodatniej liczby, 1 dla ujemnej. Operator if-else Operator 3-argumentowy: test? wartosc0 : wartosc1 Co łatwiejsze? static int ternary(int i) { return i < 10 ? i*100 : i*10; } static int ternary(int i) { if (i < 10) return *100 else return i*10 } Operator Przecinek Operator do przetwarzania sekwencyjnego. Używany tylko w instrukcji for: for (i=1, j=i+10; j<5; i++, j=i*2) { System.out.println(i + j); } Operator Łańcuchowy Plus Wyłamuje się z ogólnej zasady że operatory nie możne w Javie przeciążać. int x = 0, y = 1, z = 2; String s = “x, y, z”; System.out.println(s + x + y + z); System.out.println(x + y + z + s); Jeśli wyrażenie zaczyna się łańcuchem, to pozostałe też muszą być łańcuchami. Operatory Rzutowania Automatyczna zamiana typu na inny: int i = 1; float v = i; Rzutowanie to wymuszenie takiej konwersji: int i = 1; long l1 = (long)i; long l2 = (long)200; Rzutowanie: Konwersja Konwersja zawężająca: utrata informacji, bezpośrednie rzutowanie niezbędne. float v = 1.5; int i = (int)v; Konwersja rozszerzająca: więcej informacji, rzutowanie nie jest konieczne. int i = 1; float v = i; Rzutowanie: Ograniczenia Można rzutować każdy typ podstawowy na inny, oprócz boolean. Typów klas rzutować nie można, oprócz String. Literały Jakie są typy stałych? char c = 0xfff; //szestnastkowo int i = 0177; //ósemkowo long n = 200l //long float v = 1.5f //float double d = 47e47d //double Domyślnie stałe zmienno-pozycyjne są double, wiec f może być niezbędne. Promocja Typu Operacja na danych mniejszych niż int: – promocja argumentów to typu int – wynik typu int Największy typ danych w wyrażeniu określa rozmiar wyniku wyrażenia. Należy rzutować jak to nie odpowiada. Kolejności Operatorów jedno-argumentowe + - ++ -- arytmetyczne * / % + - << >> relacyjne > < <= >= == != logiczne i bitowe && || & | ^ warunkowy A > B ? X : Y przypisania = += -= *= /= %= Przegląd Metod Sterowania 1.if-else 2.return 3.iteracja 4.do-while 5.for 6.break i continue 7.switch Sterowanie: If-else Postać z jednym wyborem: if (wyrażenie-logiczne) instrukcja Postać z dwoma wyborami: if (wyrażenie-logiczne) instrukcja else instrukcja Sterowanie: If-else wyrażenie-logiczne zwraca wartość logiczną instrukcja prosta instrukcja zakończona średnikiem złożona instrukcja w nawiasach {...} Sterowanie: If-else static int test(int val, int zakres); { int wynik = 0; if (val > zakres) wynik = 1; else if (val < zakres) wynik = -1; else wynik = 0; return wynik; } Sterowanie: Return Dwie funkcje: ustala jaka wartość jest zwracana przez metodę – powoduje że wartość jest zwracana natychmiast – Sterowanie: Return static int test(int val, int zakres); { if (val > zakres) return 1; else if (val < zakres) return -1; else return 0; } Sterowanie: Iteracja Instrukcje iteracji: – while – do-while – for Sterowanie: While Instrukcja jest powtarzana dopóki wyrażenie logiczne jest prawdziwe: while (wyrażenie-logiczne) instrukcja Wyrażenie logiczne jest obliczane przed rozpoczęciem pętli, i przed każda iteracją. Sterowanie: While public static void main(String[] args) { double r = 0; while (r < 0.99d) { r = Math.random(); System.out.println(r); } } Math.random() generuje liczbę losową double pomiędzy 0 i 1 (wyłącznie). Sterowanie: Do-While Wyrażenie jest obliczane po pętli: instrukcja wykonuje się co najmniej raz. do instrukcja while (wyrażenie-logiczne); Sterowanie: For Inicjacja na początek, test warunku przed iteracją, wykonanie kroku po iteracji. for (inicjacja; test; krok) instrukcja Możliwość deklaracji zmiennych w instrukcji. Sterowanie: For public static void main(String[] args) { for (int i = 0; i < 128; i++) if (Character.isLowerCase((char)i)) System.out.println((char)i); } Sterowanie: Break i Continue Wewnątrz każdej instrukcji iteracji: break wychodzi z pętli, pomijając resztę instrukcji – continue przerywa wykonanie aktualnej iteracji i zaczyna następną – Sterowanie: Break i Continue public static void main(String[] args) { for (int i = 0; i < 100; i++) { if (i == 74) break; if (i % 9 != 0) continue; System.out.println(i); } } Sterowanie: Etykiety Java nie posiada instrukcji goto. Posiada etykiety przed instrukcjami iteracji, oraz etykietowane wersje break i continue. Sterowanie: Etykiety public static void main(String[] args) { int i = 0; zewnetrzny: for (; true; ) wewnetrzny: for (; i<10 ; i++) { if (i==5) break zewnetrzny; if (i==2) continue wewnetrzny; } } Sterowanie: Switch Instrukcja wielokrotnego wyboru: switch(wybor) { case wartosc1: instrukcja;break; case wartosc2: instrukcja;break; case wartosc3: instrukcja;break; ... default: instrukcja; } Sterowanie: Switch Instrukcja porównuje wynik wyrażenia wybór z każdą ze stałych wartość: jeśli jest przypadek zgodny z wartością, wykonuje się odpowiednia instrukcja – jeżeli nie istnieje taki przypadek, wykonuje się instrukcja default. – Switch: Ograniczenia Jeśli instrukcja nie kończy się przez break, to wykonują się kolejne przypadki. Wyrażenie wyboru w switch musi być typu int lub char. Instrukcje: Switch public static void main(String[] args) { char c = (char)(Math.random()*26+'a'); System.out.print(c + “: “); switch(c) { case 'a': case 'e': case 'i': case 'o': Instrukcje: Switch case 'u': System.out.println(“samogloska”); break; default: System.out.println(“spolgloska”); } }