Java Write Once, Run Anywhere
Java - Wstęp Java: Język programowania niezależny od platformy Składnia podobna do C++ Podobieństwo do j. Smalltalk
Java - Wstęp Java interesujące cechy: Automatyczna kontrola typów, Automatyczne odśmiecanie, Brak wskaźników, Uproszczony dostęp do sieci, Wielowątkowość
Jak to działa..? Compile-time Environment Run-time Environment Java Source (.java) Class Loader Bytecode Verifier Java Class Libraries Java Compiler Java Bytecodes move locally or through network Java Interpreter Just in Time Compiler Java Virtual machine Runtime System Java Bytecode (.class ) Operating System Hardware
Jak to działa..? Niezależność od platformy: Java Virtual Machine (JVM), Kod jest kompilowany do bytecode, który jest interpretowany przez JVM, JIT (just in time) kompilator
Java - Bezpieczeństwo Brak wskaźników zmniejszone szanse na uszkodzenie pamięci, Applety z ograniczeniami - Nie mogą Uruchamiać lokalnych programów, Pisać/czytać z lokalnych plików, Komunikować się z innymi serwerami niż ten, z którego pochodzą
Object-Oriented Java wspiera OOD Polimorfizm Dziedziczenie Enkapsulację Wszystko w Javie należy do jakiejś klasy Brak funkcji, zmiennych globalnych
Zalety Javy Przenośność - Write Once, Run Anywhere Przemyślane mechanizmy bezpieczeństwa Łatwe zarządzanie pamięcią Duże wsparcie dla programowania sieciowego Wbudowane mechanizmy wielowątkowości Dynamiczne ładowanie bibliotek Ładowane wtedy gdy potrzebne
Podstawowa składnia
Typy proste, zmienne boolean, char, byte, short, int, long, float, double etc. Tylko zmienne tych typów nie są obiektami Do tworzenia zmiennych tych typów nie używa się new Tworzenie zmiennych typów prostych: float initval; int retval, index = 2; double gamma = 1.2, brightness; boolean valueok = false;
Inicjalizacja Jeśli wartość nie została przypisana przed pierwszym użyciem kompilator zgłosi błąd Java automatycznie ustawia wartość zmiennych na 0 lub true (boolean) Wszystkie referencje są początkowo ustawiane jako null Tablica także jest obiektem Ma wartość null po deklaracji Elementy mają wartość null lub 0 po utworzeniu tablicy
Definicje zmiennych int index = 1.2; boolean retok = 1; // compiler error // compiler error double fivefourths = 5 / 4; // no error! float ratio = 5.8f; double fivefourths = 5.0 / 4.0; // correct // correct 1.2f jest typu float (dokładność do 7 miejsc po przecinku) 1.2 jest typu double (dokładność 15)
Przypisania Wszystkie przypisania są right associative int a = 1, b = 2, c = 5 a = b = c System.out.print( a= + a + b= + b + c= + c) Od prawej do lewej: a = (b = c);
Operatory artymetyczne * / % + - * / % mają wyższy priorytet od + or - double myval = a + b % d c * d / b; to to samo co: double myval = (a + (b % d)) ((c * d) / b);
Wyrażenia i bloki Wyrażenie to polecenie kończące się średnikiem name = Fred ; Blok to zbiór wyrażeń ograniczonych { { name1 = Fred ; name2 = Bill ; Bloki mogą zawierać inne bloki
Przepływ sterowania Java przetwarza polecenia jedno po drugim w kolejności ich występowania w kodzie Polecenia kontrolujące przepływ sterowania: Alternation: Looping: Escapes: if, if else, switch for, while, do while break, continue, return
If Wyrażenie warunkowe Wyrażenie if przetwarza warunek logiczny i jeśli jest ono true wykonuje polecenia: if ( x < 10 ) x = 10; Jeśli x jest mniejsze od 10 to ustaw x = 10 Można zapisać: Lub: if ( x < 10 ) x = 10; if ( x < 10 ) { x = 10;
Operatory służące do porównywania == Równość (uwaga przy obiektach!)!= Brak równości >= Większy lub równy <= Mniejszy lub równy > Większy < Mniejszy
If else if (x!= oldx) { System.out.print( x was changed ); else { System.out.print( x is unchanged );
Nested if else if ( myval > 100 ) { if ( remainderon == true) { myval = mval % 100; else { myval = myval / 100.0; else { System.out.print( myval is in range );
else if if ( n == 1 ) { // execute code block #1 else if ( j == 2 ) { // execute code block #2 else { // if all previous tests have failed, execute code block #3
Uwaga! ŹLE! if( i == j ) if ( j == k ) System.out.print( else i equals k ); System.out.print( i is not equal to j ); DOBRZE! if( i == j ) { if ( j == k ) System.out.print( else i equals k ); System.out.print( i is not equal to j ); // Correct!
Polecenie switch switch ( n ) { case 1: // execute code block #1 break; case 2: // execute code block #2 break; default: // if all previous tests fail then //execute code block #4 break;
Pętla for n iteracji pętli : for ( i = 0; i < n; n++ ) { // this code body will execute n times // ifrom 0 to n-1 Zagnieżdżone for : for ( j = 0; j < 10; j++ ) { for ( i = 0; i < 20; i++ ){ // this code body will execute 200 times
Pętla while while(response == 1) { System.out.print( ID = + userid[n]); n++; response = readint( Enter );
Pętla do { while do { System.out.print( ID = + userid[n] ); n++; response = readint( Enter ); while (response == 1);
Break Polecenie break powoduje wyjście z najbardziej zagnieżdżonego polecenia while, do, for lub switch for ( int i = 0; i < maxid, i++ ) { if ( userid[i] == targetid ) { index = i; break; // program jumps here after break
Continue Może być używane w pętlach while, do oraz for Powoduje przejście do kolejnej iteracji pętli for ( int i = 0; i < maxid; i++ ) { if ( userid[i]!= -1 ) continue; System.out.print( UserID + i + : + userid);
Tablice Tablica jest zbiorem wartości Tablica ma ustalone: nazwę typ długość Te wartości muszą być podane przy deklaracji tablicy Wielkość tablicy nie może się zmieniać podczas działania programu
myarray = 3 6 3 1 6 3 4 1 0 1 2 3 4 5 6 7 myarray ma miejsce na 8 elementów Dostęp do elementów poprzez ich indeks W Javie numerowanie indeksów zaczyna się od 0!
Deklarowanie tablic int myarray[]; Deklaruje tablicę wartości typu int myarray = new int[8]; Tworzy tablicę o długości 8 int myarray[] = new int[8]; Zapis w jednej linijce
Przypisywanie wartości Odwoływanie się przez indeks myarray[0] = 3; myarray[1] = 6; myarray[2] = 3;... Można zainicjować tablicę wartościami przy jej tworzeniu int myarray[] = {3, 6, 3, 1, 6, 3, 4, 1;
Przechodzenie (iterowanie) przez tablicę Pętle for są do tego przydatne for (int i = 0; i < myarray.length; i++) { myarray[i] = getsomevalue();
Tablice obiektów Do tej pory mieliśmy do czynienia z tablicami typów prostych integers doubles, floats, characters Tablice można tworzyć także dla obiektów Student studentlist[] = new Student[10]; studentlist[0] = new Student();
Java Methods & Classes
Klasy OOP - object oriented programming Kod zbudowany z klas Instancje klas to obiekty Każda klasa powinna być w osobnym pliku.java
Trzy filary OOP Enkapsulacja Objects hide their functions (methods) and data (instance variables) Dziedziczenie Each subclass inherits all variables of its superclass Polimorfizm Interface same despite different data types manual draw() car Super class automatic draw() Subclasses
Prosta klasa i metoda tej klasy Class Fruit{ int grams; int cals_per_gram; int total_calories() { return(grams*cals_per_gram);
Metody Metoda to sekwencja poleceń, która może być wywołana w kodzie na rzecz danego obiektu Metoda pobiera argumenty, wykonuje polecenia i może zwracać wartość public float convertcelsius(float tempc) { return( ((tempc * 9.0f) / 5.0f) + 32.0 );
Sygnatury metod Sygnatura metody specyfikuje: Nazwę metody Typ i nazwę każdego parametru Zwracany typ (lub void nic nie zwraca) Listę wyjątków rzucanych przez metodę public float convertcelsius (float tcelsius ) { public boolean setuserinfo ( int i, int j, String name ) throws IndexOutOfBoundsException {
Public/private Metody/składowe mogą być deklarowane jako public lub private. Do metod/składowych public jest dostęp z poza klasy Dobra praktyka: Składowe private Większość metod private Dobrze zdefiniowany interfejs publiczny klasy
Używanie obiektów Fruit plum=new Fruit(); int cals; cals = plum.total_calories(); Operator. pozwala na dostęp do publicznych metod/składowych
Konstruktory plum = new Fruit(); Konstruktor jest to metoda wywoływana podczas tworzenia obiektu danej klasy Klasa może mieć kilka konstruktorów z różnymi parametrami
Przeładowanie metod Klasa może mieć kilka wersji danej metody Fruit() {grams=50; Fruit(a,b) { grams=a; cals_per_gram=b; Patrząc na listę argumentów Java decyduje, której wersji metody użyć: Fruit f1 = new Fruit(); Fruit f2 = new Fruit(1, 2);
Java Development Kit javac - The Java Compiler java - The Java Interpreter jdb - The Java Debugger appletviewer -Tool to run the applets javap - to print the Java bytecodes javaprof - Java profiler javadoc - documentation generator javah - creates C header files
Stream Manipulation
Streams and I/O basic classes for file IO FileInputStream, for reading from a file FileOutputStream, for writing to a file Example: Open a file "myfile.txt" for reading FileInputStream fis = new FileInputStream("myfile.txt"); Open a file "outfile.txt" for writing FileOutputStream fos = new FileOutputStream ("myfile.txt"); 47
Display File Contents import java.io.*; public class FileToOut1 { public static void main(string args[]) { try { FileInputStream infile = new FileInputStream("testfile.txt"); byte buffer[] = new byte[50]; int nbytesread; do { nbytesread = infile.read(buffer); System.out.write(buffer, 0, nbytesread); while (nbytesread == buffer.length); catch (FileNotFoundException e) { System.err.println("File not found"); catch (IOException e) { System.err.println("Read failed"); 48
Filters Once a stream (e.g., file) has been opened, we can attach filters Filters make reading/writing more efficient Most popular filters: For basic types: DataInputStream, DataOutputStream For objects: ObjectInputStream, ObjectOutputStream 49
Writing data to a file using Filters import java.io.*; public class GenerateData { public static void main(string args[]) { try { FileOutputStream fos = new FileOutputStream("stuff.dat"); DataOutputStream dos = new DataOutputStream(fos); dos.writeint(2); dos.writedouble(2.7182818284590451); dos.writedouble(3.1415926535); dos.close(); fos.close(); catch (FileNotFoundException e) { System.err.println("File not found"); catch (IOException e) { System.err.println("Read or write failed"); 50
Reading data from a file using filters import java.io.*; public class ReadData { public static void main(string args[]) { try { FileInputStream fis = new FileInputStream("stuff.dat"); DataInputStream dis = new DataInputStream(fis); int n = dis.readint(); System.out.println(n); for( int i = 0; i < n; i++ ) { System.out.println(dis.readDouble()); dis.close(); fis.close(); catch (FileNotFoundException e) { System.err.println("File not found"); catch (IOException e) { System.err.println("Read or write failed"); 51
Object serialization Write objects to a file, instead of writing primitive types. Use the ObjectInputStream, ObjectOutputStream classes, the same way that filters are used. 52
Write an object to a file import java.io.*; import java.util.*; public class WriteDate { public WriteDate () { Date d = new Date(); try { FileOutputStream f = new FileOutputStream("date.ser"); ObjectOutputStream s = new ObjectOutputStream (f); s.writeobject (d); s.close (); catch (IOException e) { e.printstacktrace(); public static void main (String args[]) { new WriteDate (); 53
Read an object from a file import java.util.*; public class ReadDate { public ReadDate () { Date d = null; ObjectInputStream s = null; try { FileInputStream f = new FileInputStream ("date.ser"); s = new ObjectInputStream (f); catch (IOException e) { e.printstacktrace(); try { d = (Date)s.readObject (); catch (ClassNotFoundException e) { e.printstacktrace(); catch (InvalidClassException e) { e.printstacktrace(); catch (StreamCorruptedException e) { e.printstacktrace(); catch (OptionalDataException e) { e.printstacktrace(); catch (IOException e) { e.printstacktrace(); System.out.println ("Date serialized at: "+ d); public static void main (String args[]) { new ReadDate (); 54