Aplikacje Internetowe Podstawy języka Java Najprostsza aplikacja class Hello { public static void main(string[] args) { System.out.println("Hello World!"); Komponenty Javy JRE Java Runtime Environment Maszyny wirtualne na różne platformy JDK Java Development Kit JDK Java Development Kit Kompilator, biblioteki i narzędzia 1
Uruchomienie pierwszej aplikacji javac Hello.java java Hello lub javaw Hello Hello.java Rozszerzenia plików Java *.java kod źródłowy *.class definicja klasy w byte-code *.jar archiwum z wieloma klasami (może to być cała aplikacja lub pakiet) *.war aplikacja internetowa - jar o trochę innej strukturze Przekazywanie parametrów class Hello2 { public static void main(string[] args) { if(args.length==2) System.out.println("Parametry:"+ args[0]+","+args[1]); Hello2.java 2
Liczenie sumy parametrów class HelloSum { public static void main(string[] args) { if(p.length!=2) { System.out.println("Podaj parametry!"); System.exit(0); int a = Integer.parseInt(p[0]); int b = Integer.parseInt(p[1]); System.out.println("Suma: "+(a+b)); HelloSum.java Obsługa wyjątków class HelloSum2 { public static void main(string[] args) { if(p.length!=2) { System.out.println("Podaj parametry!"); System.exit(0); try{ int a = Integer.parseInt(p[0]); int b = Integer.parseInt(p[1]); System.out.println("Suma: "+(a+b)); catch (NumberFormatException e) { System.out.println("Nie podałeś liczb!"); HelloSum2.java Typy zmiennych Typy proste (int, double) int, short, long float, double boolean char, byte Typy obiektowe (oparte na klasach) String, Vector 3
Typy proste Problem: nie można ich traktować jak obiektów nie mogą mieć wartości null nie mają przypisanych metod Rozwiązanie: każdy typ prosty ma swoją klasę opakowującą double -> Double int -> Integer klasa opakowująca zawiera użyteczne metody konwersji Kalkulator kredytowy Obliczenie wysokości miesięcznej raty spłaty kredytu na podstawie jego kwoty, oprocentowania rocznego i liczby rat miesięcznych oproc /12 rata = kwota* 1 1 1+ ( oproc /12) liczba _ rat Kalkulator kredytowy class Kredyt { try{ double kwota = Double.parseDouble(p[0]); d bl bl bl ( [1]) double procent = Double.parseDouble(p[1]); double lat = Double.parseDouble(p[2]); double rata = kwota * (procent/12)/ (1-(1/Math.pow(1+procent/12,lat*12))); System.out.println("Rata "+rata); catch (NumberFormatException e) { System.out.println("Nie podałeś liczb!"); Kredyt.java 4
Tworzenie funkcji class Kredyt { try{ double rata = liczrate(double.parsedouble(p[0]), Double.parseDouble(p[1]), Double.parseDouble(p[2])); System.out.println("Rata "+rata); catch (NumberFormatException e) { System.out.println("Nie podałeś liczb!"); Tworzenie funkcji/metody class Kredyt2 { double liczrate(double kwota, double procent, double lat) { double proc_m = procent/12; double rat = lat*12; double wsp = 1/Math.pow(1.0+proc_m,rat); wsp = 1 - wsp; wsp = proc_m / wsp; return kwota * wsp; Kredyt2.java Tworzenie funkcji class Kredyt2 { double liczrate(double kwota, double procent, double lat) { double proc_m = procent/12; double rat = lat*12; double wsp = 1/Math.pow(1.0+proc_m,rat); wsp = 1 - wsp; wsp = proc_m / wsp; return kwota * wsp; Kredyt2.java 5
Static members Class Foo{ int x; Foo f1=new Foo(); Foo f2=new Foo(); f1.x=1; f2.x=2; println(f1.x+, +f2.x); Class Foo{ static int x; Foo f1=new Foo(); Foo f2=new Foo(); f1.x=1; f2.x=2; println(f1.x+, +f2.x); 1,2 2,2 Tworzenie funkcji class Kredyt3 { Kredyt3 k = new Kredyt3(); try{ double rata = k.liczrate(double.parsedouble(p[0]), Double.parseDouble(p[1]), Double.parseDouble(p[2])); System.out.println("Rata "+rata); catch (NumberFormatException e) { System.out.println("Nie podałeś liczb!"); Kredyt3.java Konstruktor class Kredyt4 { double rata; try{ Kredyt4 k = new Kredyt4(Double.parseDouble(p[0]), Double.parseDouble(p[1]), Double.parseDouble(p[2])); System.out.println("Rata "+k.rata); catch (NumberFormatException e) { public Kredyt4(double kwota, double procent, double lat) { double wsp = 1-1/Math.pow(1.0+procent/12,lat*12); wsp = proc_m / wsp; rata = kwota * wsp; Kredyt4.java 6
Metoda typu getter class Kredyt5 { double rata; try{ Kredyt5 k = new Kredyt5(Double.parseDouble(p[0]), Double.parseDouble(p[1]), Double.parseDouble(p[2])); System.out.println("Rata "+k.getrata()); catch (NumberFormatException e) { public Kredyt5(double kwota, double procent, double lat) { public double getrata() { return rata; Kredyt4.java Standardy nazewnictwa Klasy dużą literą MojaKlasa Metody i pola małą literą camelcase addcar(), firstname Stałe dużymi literami static final TIMEOUT Pakiety małymi literami com.comarch.kurs Standardy nie są obowiązkowe Kalkulator kredytowy Obliczenie wysokości miesięcznej raty spłaty kredytu na podstawie jego kwoty, oprocentowania rocznego i liczby rat miesięcznych oproc /12 rata = kwota* 1 1 1+ ( oproc /12) liczba _ rat 7
class Kredyt5 { double wsp; Parametryzacja kwoty Kredyt5 k = new Kredyt5(procent, lata); System.out.println("Rata "+k.getrata(kwota)); public Kredyt5(double procent, double lat) { wsp = 1-1/Math.pow(1.0+procent/12,lat*12); wsp = (procent / 12) / wsp; public double getrata(double kwota) { return wsp*kwota; Kredyt5.java Kalkulator class Kalkulator { try{ Kredyt k = new Kredyt(Double.parseDouble(p[1]), Double.parseDouble(p[2])); p System.out.println("Rata"+ k.getrata(double.parsedouble(p[0]))); catch (NumberFormatException e) { System.out.println("Nie podałeś liczb!"); Kalkulator.java Klasa Kredyt class Kredyt { double wsp; public Kredyt(double procent, double lat) { wsp = 1-1/Math.pow(1.0+procent/12,lat*12); p wsp = (procent / 12) / wsp; double getrata(double kwota) { return wsp * kwota; Kredyt.java 8
------Kalkulator.java---------------------------------------- class Kalkulator { try{ Kredyt k = new Kredyt(Double.parseDouble(p[1]), Double.parseDouble(p[2])); System.out.println("Rata"+ k.getrata(double.parsedouble(p[0]))); catch (NumberFormatException e) { System.out.println("Nie podałeś liczb!"); ------Kredyt.java---------------------------------------- class Kredyt { double wsp; public Kredyt(double procent, double lat) { wsp = 1-1/Math.pow(1.0+procent/12,lat*12); wsp = (procent / 12) / wsp; double getrata(double kwota) { return wsp * kwota; Klasa Kredyt class Kredyt { double wsp; public Kredyt(double procent, double lat) { wsp = 1-1/Math.pow(1.0+procent/12,lat*12); t/12 t*12) wsp = (procent / 12) / wsp; double getrata(double kwota) { return wsp * kwota; Widoczność elementów class Kredyt { private double wsp; public Kredyt(double procent, double lat) { 1 1/M th (1 0+ t/12 l t*12) wsp = 1-1/Math.pow(1.0+procent/12,lat*12); wsp = (procent / 12) / wsp; public double getrata(double kwota) { return wsp * kwota; 9
Instrukcje pętli while(warunek) { instrukcje; int i=0; while(i<10) {System.out.println("A");i++; for(inicjalizacja; warunek; iteracja) for(int i=0;i<10;i++) {System.out.println("A"); do { instrukcje; while(warunek) int i=0; do {System.out.println("A");i++; while(i<10); Pętla pytająca boolean koniec = false; while(!koniec) { //tu wyliczanie kredytu if(warunek) koniec = true; Tablice Deklaracja: Typ[ ] nazwa int[] tablica; Definicja: new Typ[wielkosc] tablica = new int[20]; Można w jednej linijce: int[] tablica = new int[20]; Typ elementów tablicy może być prosty lub obiektowy: String[ ] tablica, MojaKlasa[ ] tablica 10
Tabela kredytów class Kalkulator1 { int N = 10; Kredyt[] kredyty; for(int i=0; i<n; i++ ) { kredyty[i] = new Kredyt(0.02, i+1); Tabela kredytów class Kalkulator1 { int N = 10; Kredyt[] kredyty; kredyty = new Kredyt[N]; for(int i=0; i<n; i++ ) { kredyty[i] = new Kredyt(0.02, i+1); Tabela kredytów class Kalkulator1 { int N = 10; Kredyt[] kredyty = new Kredyt[N]; for(int i=0; i<n; i++ ) { kredyty[i] = new Kredyt(0.02, i+1); Kalkulator1.java 11
Tabela kredytów class Kalkulator1 { int N = 10; Kredyt[] kredyty = new Kredyt[N]; for(int i=0; i<n; i++ ) { kredyty[i] = new Kredyt(0.02, i+1); for(int i=0; i<n; i++ ) { System.out.println("Lata: "+(i+1)+ " Rata: "+kredyty[i].getrata(10000)); Kalkulator1.java Klasa Kredyt class Kredyt { private double wsp; public Kredyt(double procent, double lat) { wsp = 1-1/Math.pow(1.0+procent/12,lat*12); wsp = (procent / 12) / wsp; public double getrata(double kwota) { return wsp * kwota; Zmiana Chcemy przechowywać wszystkie dane na temat kredytu (kwota, oproc, ile lat) Rozwiązanie: dodadnie nowych pól kwota rata oproc ilerat 12
Nowa klasa Kredyt class Kredyt { private double procent; private double kwota; private double rata; private double ilrat; public Kredyt(double kwota, double procent, double lat) { this.kwota = kwota; this.procent = procent; this.ilrat = lat*12; this.obliczrate(); gettery i settery Gettery i settery (bez setrata()!) public double getkwota() { return kwota; public void setkwota(double kwota) { this.kwota = kwota; public double getprocent() { return procent; public void setprocent(double procent) { this.procent = procent; public double getilrat() { return ilrat; public void setilrat(double ilrat) { this.ilrat = ilrat; Obliczanie raty void obliczrate() { double wsp = 1-1/Math.pow(1.0+procent/12,ilRat); wsp = (procent / 12) / wsp; rata = wsp * kwota; // powinno być wywoływane przy każdej zmianie parametrów!!! public void setkwota(double kwota) { this.kwota = kwota; obliczrate(); 13
Gotowy Kredyt Pola dostępne przez gettery i settery Trochę logiki (ale niedostępnej bezpośrednio z zewnątrz) Tak oto powstał nasz pierwszy BEAN (ziarenko) Rozszerzenia kredytu Kredyt walutowy dodatkowo informacje o walucie i przeliczniku na PLN Konieczne stworzenie nowej klasy Możemy jednak użyć klasy już istniejącej i tylko ją rozszerzyć Nowa klasa będzie dziedziczyła po klasie bazowej Zapis w kodzie: class KredytWalutowy extends Kredyt Klasa KredytWalutowy Rozszerza klasę Kredyt Dwa nowe pola: waluta i przelicznik gettery i settery do nowych pól N k k! Nowy konstruktor! Modyfikacja metody getrata() uwzględnić przelicznik! zakładamy, że rata podawana jest zawsze w złotówkach Nowa metoda getratawaluta() podaje ratę w walucie kredytu 14
Konstruktory Każda klasa bez konstruktora ma domyślny konstuktor pusty Stworzenie własnego konstruktora usuwa konstruktor pusty! Może być klika konstruktorów z innymi parametrami Wywołanie konstuktora klasy bazowej: super(parametry) Rozszerzenie przykładu Klasa Klient numer nazwa adres telefon mail Podklasy Osoba (dodatkowo: imię, data urodzenia) Firma (dodatkowo: NIP, REGON) Stworzenie różnych klientów Klient k = new Klient(); k.setnumer(1); k.setnazwa("aaa"); Osoba os = new Osoba(); os.setnumer(2); os.setnazwa("kowalski"); os.setimie("adam"); Firma f = new Firma(); f.setnumer(3); f.setnazwa("krzaczek Sp. z o.o."); f.setregon("12345"); 15
Tablica klientów Klient[] klienci = new Klient[3]; klienci[0] = k; klienci[1] = os; klienci[2] i[2] = f; for(int i=0;i<3;i++) { System.out.println("Klient "+klienci[i].getnazwa()); // jak sprawdzić jakiej klasy są klienci? Klasa Object Każda klasa w Javie dziedziczy po klasie Object Klasa object zawiera kilka użytecznych metod getclass() tostring() equals() clone() wait() notify() Sprawdzenie klasy Odczyt klasy z obiektu obj.getclass() Sprawdzenie czy obiekt z danej klasy if(obj instanceof NazwaKlasy) Rzutowanie obiektu na klasę NazwaKlasy x = (NazwaKlasy)obj; 16
Tablica klientów Klient[] klienci = new Klient[3]; klienci[0] = k; klienci[1] = os; klienci[2] i[2] = f; for(int i=0;i<3;i++) { System.out.println("Klient "+klienci[i].getnazwa()); System.out.println("Klasa> "+klienci[i].getclass()); Jak użyć metod klasy Tablica obiektów typu Klient klienci[i].getimie() nie działa! Należy wykonać rzutowanie: Osoba oo = (Osoba)klienci[i]; i[i] Teraz oo.getimie() działa! Uwaga jeśli obiekt w tabeli nie jest typu Osoba mamy ClassCastException! Sprawdzenie klasy String opis = klienci[i].getnazwa(); if(klienci[i] instanceof Osoba) { Osoba oo = (Osoba)klienci[i]; opis += " imie: " + oo.getimie(); if(klienci[i] instanceof Firma) { Firma ff = (Firma)klienci[i]; opis += " regon: " + ff.getregon(); System.out.println(opis); 17
Sprawdzenie klasy (2) String opis = klienci[i].getnazwa(); if(klienci[i] instanceof Osoba) { opis += " imie: " + ((Osoba)klienci[i]).getImie(); if(klienci[i] instanceof Firma) { opis += " regon: " + ((Firma)klienci[i]).getRegon(); System.out.println(opis); Uwagi dodatkowe Jeśli obiekt jest instanceof Osoba to zawsze także jest instanceof Klient O rzutowaniu (cast) nie wolno zapomnieć! Metoda getclass() jest zaimplementowana w klasie Object po której dziedziczą wszystkie klasy w Javie Przesłanianie metod Przesłanianie = overriding W klasie podrzędnej tworzona jest nowa implementacja metody z klasy nadrzędnej Przykład: metoda tostring() w klasie Klient public String tostring() { return numer+" "+nazwa; metoda tostring() w klasie Osoba public String tostring() { return numer+" "+imie+" "+nazwa; 18
Użycie w programie Niezależnie od typu: for(int i=0;i<3;i++) { String opis = klienci[i].tostring(); System.out.println(opis); Wystarczy tak (metoda tostring() jest domyślna): for(int i=0;i<3;i++) { System.out.println(klienci[i]); W zależności od typu uruchamiana jest inna metoda Modyfikatory abstract klasa - obiekty tej klasy nie mogą być inicjalizowane, muszą być klasy dziedziczące metoda - musi zostać przesłonięta w podklasie final klasa po tej klasie nie można dziedziczyć metoda - nie może zostać przesłonięta w podklasie zmienna wartość nie może być zmieniana static final int TIMEOUT = 200; // stała w programie Klasy i interfejsy Klasa zawiera metody i pola Interfejs zawiera tylko nagłówki metod, które muszą zostać zaimplementowane w klasach Dzięki wspólnemu interfejsowi różne klasy mogą być traktowane tak samo Klasa może rozszerzać tylko jedną inną klasę ale może implementować dowolną liczbę interfejsów Dzięki interfejsom program uniezależnia się od konkretnych implementacji klas 19
Interfejs MojeInfo Interfejs: public interface MojeInfo { public String info(); Klasy implementujące: class Klasa1 implements MojeInfo { class Klasa2 implements MojeInfo { Użycie w programie: MojeInfo x = (MojeInfo)obj; //cast do interfejsu! String txt = x.info(); 20