Podstawowe konstrukcje języka Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin realizacji: – Szkolenie finansowane ze środków Europejskiego Funduszu Społecznego (75%) i budżetu państwa (25%) w ramach Zintegrowanego Programu Operacyjnego Rozwoju Regionalnego
Zmienne Zmienne w Javie dzielą się na 3 rodzaje typów typ obiektowy typ prymitywny typ tablicowy Zmienne muszą być deklarowane przed użyciem; deklaracja może jednocześnie być połączona z inicjalizacją zmiennej Typy w Javie są ściśle kontrolowane nie można przypisać zmiennej jednego typu danej drugiego typu
Zmienne (cd.) zmienne prymitywne int licznik = 0; double suma = 0.0; boolean pelnoletni = false; char literaA = 'A'; zmienne obiektowe Date teraz = new Date(); String imie = new String("Kazimierz"); String imie = "Kazimierz"; zmienne tablicowe int[] wynikiTotka = new int[6]; String[] studenci = new String[3]; String[] studenci = {"Kowalski", "Nowak", "Kaczmarek"};
Typy prymitywne Typy prymitywne (inaczej proste) służą do reprezentacji danych, które nie są obiektami Typami prymitywnymi są: int, long, short, byte, char, boolean, float i double Typy prymitywne są przechowywane na stosie (wkompilowane w program)
Odpowiedniki typów prymitywnych Typy prymitywne często nie wystarczają Dlatego mają swoje odpowiedniki obiektowe Integer, Short, Long, Byte Boolean Character Float, Double Obiekty tych typów mogą mieć nadane wartości tylko przy ich tworzeniu Integer jedynka = new Integer(1); int wartosc = jedynka.intValue();// wartosc == 1 jedynka.ustawWartość(2); // niemożliwe....
Napisy Napisy są w Javie reprezentowane przez typ java.lang.String Łączenie napisów napis1 + napis 2 połączenie dwóch napisów zawsze powoduje utworzenie trzeciego String napis1 = "Ala"; String napis2 = "ma"; String napis2 = "kota"; System.out.println(napis1 + " " + napis2 + " " + napis3);
Obsługa napisów Pomiar długości napisu int length() Wycinanie fragmentów napisów String substring(int poczatek, int koniec) Czy napis zaczyna się od podanego fragmentu? boolean startsWith(String fragment) Czy napis kończy się na podanym fragmencie? boolean endsWith(String fragment) Zamiana wielkości liter String toLowerCase() String toUpperCase()
Obsługa napisów Porównanie z innym napisem int compareTo(String innyNapis) bolean equals(String innyNapis) Porównanie z innym napisem bez różnicy w wielkości boolean equalsIgnoreCase(String innyNapis) Odczyt znaku na podanej pozycji char charAt(int pozycja) Odczyt pozycji podanego znaku int indexOf(char znak) int lastIndexOf(char znak)
Napisy – trochę inaczej Istnieje drugi typ reprezentujący napisy java.lang.StringBuffer StringBuffer pozwala na łączenie napisów bez konieczności tworzenia nowych obiektów StringBuffer napis1 = new StringBuffer(); napis1.append("Ala").append(" "); napis1.append("ma").append(" "); napis1.append("kota"); System.out.println(napis1);
Funkcja printf() W wersji Java 5.0 wprowadzono znaną z języka C (i innych...) funkcję printf() System.out.printf(tekst, zmienna1, zmienna2,...); Formaty %c znak o podanym kodzie %s napis %d całkowita liczba dziesiętna ze znakiem %u całkowita liczba dziesiętna bez znaku %f liczba zmiennoprzecinkowa "Imię: %s, wiek %u" imie wiek
Stałe Stałe reprezentują dane, które się nie zmieniają Można tylko raz przypisać wartość zmiennej; drugie przypisanie zostanie uznane przez kompilator za błąd Stałą jest zmienna poprzedzoną słowem final final int LICZBA_KOL_W_SAMOCHODZIE = 4; final double GRAWITACJA = 9.81; final String uczelnia = "WSB";
Typy obiektowe Typ obiektowy pozwala przechowywać dane będące obiektami danej klasy W Javie wszystkie typy poza typami prymitywnymi są typami obiektowymi (tablice też) Typy obiektowe (klasy) można samodzielnie definiować MojaKlasa klasa; MojaKlasa klasa = new MojaKlasa(); typ obiektowy utworzenie obiektu zmienna
Instrukcja if Instrukcja warunkowa if pozwala wykonać instrukcję jeżeli podany warunek jest prawdziwy Opcjonalnie, w klauzuli else można podać instrukcję, która ma być wykonana, jeżeli warunek jest nieprawdziwy if (wiek < 13) szkola = "Podstawówka"; else szkoła = "Inna";
Instrukcja for Instrukcja for pozwala wykonywać określone polecenia w pętli, wykorzystując zmienne sterujące Pętla for pozwala na realizację wielu typów pętli for (int licznik = 0; licznik < 10; licznik++) { System.out.println("Licznik=" + licznik); instrukcja początkowa pętli warunek kontynuacji instrukcja postępu pętli
Instrukcja while Instrukcja while pozwala wykonywać określone polecenia dopóki spełniony jest warunek kontynuacji sprawdzany na początku pętli while (licznik < 25) System.out.println("Licznik=" + licznik++); warunek kontynuacji
Instrukcja do..while Instrukcja do..while pozwala wykonywać określone polecenia dopóki spełniony jest warunek kontynuacji sprawdzany na końcu pętli do..while różni się od while tym, że zostanie wykonana przynajmniej raz do { System.out.println("Licznik=" + licznik++); } while (licznik < 25); warunek kontynuacji
Instrukcja switch Instrukcja switch pozwala wykonywać określone polecenia w zależności od wartości wyrażenia Instrukcja switch działa jedynie dla wyrażeń o wartościach całkowitych, znakowych lub logicznych switch (znak) { case 'A' : System.out.print('A'); break; case 'B' : System.out.print('B'); break; default : System.out.print('D'); } wyrażenie sterujące przypadek 'A' przypadek domyślny przerwanie
Instrukcje break, continue i return Instrukcja break przerywa działanie pętli i powoduje jej opuszczenie Instrukcja continue przerywa bieżącą iterację pętli i powoduje przejście do następnej Instrukcja return powoduje opuszczenie bieżącej metody (funkcji) i ew. zwrócenie wyniku
Instrukcje break i continue for (int x = 0; x 5) continue; // koniec danej iteracji if (x > 10) break;// koniec pętli } Instrukcja break przerywa działanie pętli i powoduje jej opuszczenie Instrukcja continue przerywa bieżącą iterację pętli i powoduje przejście do następnej
Instrukcja return public int fibb(int n) { if (n == 1 || n == 2) return 1; return fibb(n–1) + fibb(n–2); } fibb(1) == 1 fibb(2) == 1 fibb(5) == fibb(4) + fibb(3) Instrukcja return powoduje opuszczenie bieżącej metody (funkcji) i ew. zwrócenie wyniku
Instrukcja złożona Instrukcja złożona jest sekwencją instrukcji ograniczoną znakami '}' i '{' Może być użyta w instrukcjach warunkowych i pętlach w miejsce pojedynczej instrukcji if (wiek < 13) { szkola = "Podstawówka"; System.out.println(szkola); } else { szkoła = "Inna"; System.out.println(szkola); }
Operatory Arytmetyczne +, –, *, /, % Inkrementacji i dekrementacji ++, – – (prefiksowy i postfixowy) Porównania >, >=, ==, <=, <, != Logiczne && (and), || (or), ! (not), ^ (xor) Bitowe & (and), | (or), ~ (dopełnienie), ^ (xor)
Operatory (cd.) Przypisania =, op= (op jest operatorem dwuargumentowym: +, –, etc.) Konkatenacji łańcuchów + przykład: "Ala ma " + wiek + " lat" Sprawdzenia typu obiektowego instanceof przykład: kot instanceof Ssak Warunkowy :? przykład: x = (a > 5? 1: 2);
Konwersje i rzutowania Konwersja niejawna jest wykonywana automatycznie między typami liczbowymi mniejszymi a większymi byte short int long float double przykład: int a = 1; long b = a; // OK Konwersja jawna (rzutowanie) jest wymagana w pozostałych przypadkach przykład: long a = 1; int b = (int) a; // OK, ale możliwa utrata informacji
Wyrażenia Wyrażeniem jest ciąg operacji posiadający jakąś wartość, którą można obliczyć Składnia wyrażeń jest wzorowana na języku C i pochodnych a / (2 * b) a + b * (5 – 3 * a) 2 * Math.sin(Math.PI / 2) (a > 5? 10: 0)
Modyfikatory dostępu Modyfikatory dostępu określają, jak dostępna jest dana klasa lub metoda private: metoda jest dostępna tylko dla innych metod w tej samej klasie protected: metoda jest dostępna dla innych metod w tej samej klasie lub w podklasach public: metoda jest dostępna dla wszystkich metod we wszystkich klasach domyślny: metoda jest dostępna dla wszystkich klas w pakiecie public class Fibbonacci { public int fibb(int n) {} }
Wybrane inne modyfikatory abstract: metoda jest jedynie zadeklarowana, natomiast jej definicja (treść) powinna znaleźć się w klasach potomnych static: metoda/pole jest dostępne bez konieczności tworzenia obiektów (instancji klas) final: "zamyka" pole, metodę lub klasę metoda nie może być pokrywana, pole nie może być zmieniane (jest stałą), klasa nie może posiadać podklas. public class Fibbonacci { final static int ELEM_1 = 1; public abstract int fibb(int n); }
Klasy Program w Javie jest zbudowany z klas Klasa posiada pola i metody public class Rachunek { private String numer; private String wlasciciel; private int saldo; public Rachunek(String n, String w) { numer = n; wlasciciel = w; saldo = 0; } public void wplata(int kwota) { saldo += kwota; }
Konstruktor Każdy obiekt musi posiadać konstruktor; jeżeli go nie ma, wówczas kompilator generuje domyślny (pusty, bezparametrowy) public class Rachunek... public Rachunek(String id, String wlasciciel) { } modyfikator dostępu brak zwracanego typu lista parametrów
Konstruktor public class Rachunek { public Rachunek(String id, String wlasciciel) { //... } public Rachunek(String id) { this(id, null); } konstruktor nr 1 konstruktor nr 2 Konstruktor zawsze nazywa się tak jak jego klasa Klasa może posiadać dowolną liczbę konstruktorów odwołanie do konstruktora nr 1
Utworzenie obiektu Rachunek rachunek; Rachunek rachunek = new Rachunek(1, "Nowak"); typ obiektowy wywołanie konstruktora: utwórz nowy rachunek, nadaj mu nr 1 i właściciela Nowaka zmienna operator new Obiekt jest tworzony przez operator new i wywołanie konstruktora Uzyskaną referencję do obiektu można zapamiętać w zmiennej
Metody (funkcje) Program jest wykonywany poprzez wywołania metod Metody są ciągiem instrukcji, posiadają nazwę i mogą zwrócić wartość Metody muszą być zdefiniowane wewnątrz klas public int fibb(int n) { if (n == 1 || n == 2) return 1; return fibb(n–1) + fibb(n–2); } parametry nazwa metody typ zwracany ciało metody sygnatura metody
Wywołanie metody na obiekcie Rachunek rachunek = new Rachunek(1, "Nowak"); rachunek.wplata(1000); parametry metody obiekt komunikat (metoda) Wywołanie metody polega na wysłaniu do obiektu komunikatu z parametrami
Pola (atrybuty) Pola przechowują informacje w klasie Pola definiuje się identycznie jak zmienne, tylko na poziomie klasy public class Student { private String imie; private String nazwisko; public Student(String i, String n) { imie = i; nazwisko = n; } }
Interfejs public interface InstytucjaFinansowa { public void wplata(String numer, int kwota); public void wyplata(String numer, int kwota) } nazwa klasy deklaracje metod Interfejs, podobnie jak klasa, musi być zdefiniowany w osobnym pliku o nazwie takiej jak interfejs Interfejs deklaruje nazwy metod, ale nie zawiera ich definicji (treści, ciała) Interfejs jest "okienkiem", przez które można zajrzeć do klasy, która go implementuje
Interfejs SKOKATMskarbonka instytucja finansowa
Interfejsy i klasy public class Bank implements InstytucjaFinansowa { public void wplata(String numer, int kwota) { Rachunek rachunek = (Rachunek) rachunki.get(numer); rachunek.wplata(kwota); } public void wyplata(String numer, int kwota) { Rachunek rachunek = (Rachunek) rachunki.get(numer); rachunek.wplata(kwota); } implementacja interfejsu implementacja metody wplata() implementacja metody wyplata()
Interfejsy i klasy public class Bankomat implements InstytucjaFinansowa { public void wplata(String numer, int kwota) { Karta karta = (Karta) karty.get(numer); karta.wplac(kwota); } public void wyplata(String numer, int kwota) { Karta karta = (Karta) karty.get(numer); karta.wyplac(kwota); } implementacja interfejsu implementacja metody wplata() implementacja metody wyplata()
Interfejsy i klasy public class Skarbonka implements InstytucjaFinansowa { public void wplata(String numer, int kwota) { monety += kwota; } public void wyplata(String numer, int kwota) { this.rozbij(); monety = 0; } implementacja interfejsu implementacja metody wplata() implementacja metody wyplata()
Dziedziczenie public class KontoLokacyjne extends Rachunek public void ulokuj(int kwota) {...} public void wplata(int kwota) {...} } nadklasa nowa metoda Dziedziczenie pozwala utworzyć nową klasę na bazie już istniejącej Nowa klasa ( podklasa ) domyślnie dziedziczy wszystkie cechy (pola i metody) nadklasy, ale może też je przedefiniować Podklasa jest szczególnym przypadkiem nadklasy i może być zawsze użyta zamiast niej metoda przedefiniowana
Pakiety Pakiety pozwalają odróżnić różne klasy o tych samych nazwach Pakiet + nazwa klasy tworzą pełną nazwę klasy Pakiety mogą być w sobie zagnieżdżane package pl.org.inmost.java.adamnowak; class Klasa {} pełna nazwa: pl.org.inmost.java.adamnowak.Klasa
Polecenia importu Polecenie importu na początku pliku klasy wskazuje, że ta klasa potrzebuje innej klasy Import nie powoduje dołączenia jakiegokolwiek kodu do pliku wynikowego kompilacji; podpowiada jedynie kompilatorowi, o jakie obce klasy chodzi import java.util.Map; // import pojedynczej klasy import java.io.*;// import wszystkich klas z pakietu
Konwencje nazewnicze Typy prymitywne: małymi literami int, float, boolean Typy obiektowe (klasy, interfejsy): z dużej litery String, MojaKlasa Zmienne i pola klas: małymi literami i, imie, licznikPetli, daneOsobowe Stałe: dużymi literami PI, NAZWA_UCZELNI metody: małymi literami public void wydrukuj(String tekst) publik void wydrukujNaEkranie(String tekst)
Komentarze /* komentarz wieloliniowy obowiązuje między znakami "/*" i "*/" */ int i; // komentarz jednoliniowy // obowiązuje od znaków "//" do końca linii /** komentarz JavaDoc pozwala dokumentować kod Bartosz 1.0 */
Pytania?