Programowanie w Java
Co to jest Java? Java jest obiektowym językiem programowania stworzonym przez grupę roboczą pod kierunkiem Jamesa Goslinga z firmy Sun Microsystems Java jest językiem tworzenia programów źródłowych kompilowanych do kodu bajtowego, czyli postaci wykonywanej przez maszynę wirtualną
Pochodzenie Javy Podstawowe koncepcje Javy pochodzą z: języka Smalltalk - maszyna wirtualna, garbage collection języka C++ - duża część składni i słów kluczowych
Historia Javy 1990 - Bill Joy w raporcie „Further” sugeruje SUNowi stworzenie środowiska obiektowego na bazie C++, 1991 - W ramach projektu „Green” powstaje język OAK - „Object Application Kernel” (James Gosling), przeznaczony dla aplikacji w elektronice powszechnego użytku, 1995 - zmiana nazwy na JAVA ze względu na zastrzeżenie nazwy OAK, 1996 - Pojawia się Netscape zgodny z Javą 1.0, Sun propaguję darmowe środowisko JDK 1.0, 1999 - Java 2 Nowe oblicze Javy ...
Główne źródła informacji o Javie w Internecie http://java.sun.com, SUN, The source of Java Technology (źródło technologii Javy), http://java.sun.com/docs/books/jls/, Gosling J., Joy B, Steele G. The Java Language Specification. Addison-Wesley, 1996, (specyfikacja języka), http://java.sun.com/products/jdk/1.2, SUN, Java 2 SDK software and documentation site (strona źródłowa oprogramowania i dokumentacji Javy), http://developer.java.sun.com/developer/infodocs/, SUN, On-line books & Tutorials (książki i podręczniki do nauki Javy), http://java.sun.com/docs/books/tutorial, SUN, The Java Tutorial (Podręcznik Javy)
Forum użytkowników Javy http://www.javaworld.com, http://www.javareport.com, http://www.jars.com, http://www.gamelon.com, http://www.javalobby.com
Platforma Javy składa się z dwóch elementów: Java API (Application Programming Interfaces) - interfejsy tworzenia aplikcaji JavaVM (Virtual Machine) - maszyna wirtualna
Java API Oprogramowanie pogrupowane w biblioteki (libraries) nazywane też pakietami (packages) Gotowe fragmenty kodu, pogrupowane w pakiety przeznaczone do pewnych celów
Maszyna wirtualna interpretuje kod wynikowy (Beta-kod) Javy do kodu wykonywalnego danego systemu operacyjnego i komputera, którego jest nadbudową jest interfejsem pomiędzy uniwersalnym kodem Javy, a różnymi konfiguracjami komputerów
JRE i JDK Platforma Javy składa się z dwóch części: JRE (Java Runtime Environment) – środowisko uruchomieniowe JDK (Java Development Kit) – środowisko tworzenia aplikacji
Platforma Javy
Środowisko uruchomieniowe JRE Spełnia trzy zadania: Ładuje aplikacje Java Weryfikuje kod Java Wykonuje kod Java
Środowisko uruchomieniowe JRE
Środowisko tworzenia aplikacji JDK JDK (Java Development Kit) składa się z: JRE narzędzi kompilacji źródeł standardowych bibliotek
Narzędzia JDK Program Zastosowanie java Interpreter Javy, pozwalający uruchamiać samodzielnie programy javac Kompilator Javy. javadoc Generator dokumentów Javy. javah generator plików C, tworzący pliki nagłówkowe oraz pliki źródłowe zawierające tekst potrzebny do definiowania klas. javap Disasembler Javy. jdb Debuger Javy.
Java Platform SE 6
Proces tworzenia aplikacji Javy Napisanie z pomocą dowolnego edytora tekstu kodu źródłowego programu zawierającego klasę publiczną o nazwie takiej samej jak docelowa nazwa programu np. RycerzJedi Nagranie kodu źródłowego jako pliku o danej nazwie z rozszerzeniem .java, np.RycerzJedi.java
Proces tworzenia aplikacji Javy Kompilacja kodu źródłowego zawartego w pliku z rozszerzeniem .java do pliku docelowego o rozszerzeniu .class zawierającego Beta-kod np. c:\ javac RycerzJedi.java Uruchomienie w środowisku interpretatora Beta-kodu, np. c:\ java RycerzJedi
Klasa Javy - konstrukcja class NazwaKlasy { // pola typ_zmiennej zmienna; ... // konstruktor – metoda o tej samej nazwie co klasa wywołana automatycznie przy tworzeniu obiektu tej klasy NazwaKlasy(typ_argumentu nazwa_argumentu, ..., typ_argumentu nazwa_argumentu) { // tresc_konstruktora } // metody typ_wart_zwracanej nazwaMetody(typ_argumentu nazwa_argumentu, ..., typ_argumentu nazwa_argumentu) { // tresc_metody } // koniec klasy NazwaKlasy
Klasa Javy - przykład class RycerzJedi{ // pola String nazwa; String kolor_miecza; //konstruktor RycerzJedi(String nazwa, String kolor_miecza){ this.nazwa=nazwa; this.kolor_miecza=kolor_miecza; } // metody void opis(){ System.out.println(”Rycerz ”+nazwa+ ” ma ”+kolor_miecza+” miecz.”); }// koniec class RycerzJedi
Aplikacja Javy Aplikacja w języku Java to zdefiniowana klasa publiczna wraz z jedną ściśle określoną metodą statyczną o formie: public static void main(String args[]) { // tresc metody } // koniec main
String args[] Tablica „args[]” będąca argumentem metody main() jest zbiorem argumentów wywołania aplikacji w ciele której znajduje się metoda Kolejność argumentów jest następująca: argument 1 wywołania umieszczany jest w args[0], argument 2 wywołania umieszczany jest w args[1], itd. Ilość argumentów jest zapisana w polu args.length
Przykład main public class Jedi{ public static void main(String args[]){ System.out.println(”Rycerz Luke ma niebieski miecz.”); }// koniec main) }// koniec public class Jedi
Proste typy danych
Typy proste boolean - typ logiczny char - typ znakowy (16-bitowy Unicode) byte - wartość całkowita 8-bitowa ze znakiem short - wartosć całkowita 16-bitowa ze znakiem
Typy proste int - wartosć całkowita 32-bitowa ze znakiem long - wartosć całkowita 64-bitowa ze znakiem float - wartosć zmiennoprzecinkowa 32- bitowa,IEEE 754 double - wartosć zmiennoprzecinkowa 64- bitowa,IEEE 754
Typ boolean posiada dwie wartości: przykład boolean truth = true; true false przykład boolean truth = true;
Typ char reprezentuje 16-bitowy znak w kodzie Unicode stałe znakowe muszą być ujęte w pojedynczy cudzysłów (‘ ’) stałe znakowe mają następujące notacje: ‘a’ ‘\t’ ‘\u????’ przykład char znak = ‘A’;
Typ String String jest klasą reprezentującą łańcuch znakowy łańcuch stały musi być umieszczony w podwójny cudzysłów (” ”) przykład String greeting = "Good Morning !! \n";
Typy byte, short, int i long posiadają trzy formy zapisu: decymalną (np. 2) oktalną ( np. 077) heksadecymalną (np. 0xBAAC) Zakresy:
Typy float i double formy zapisu: Zakresy: z kropką (np. 2.4) E or e (add exponential value) (np. 6.02E23) F or f (float) (np. 2.718F) D or d (double) (np. 123.4E+306D) Zakresy:
Deklaracja zmiennych
Tablice Tablice w języku Java są definiowane tylko dynamicznie Tablica jednowymiarowa typ tabJednowymiarowa [] = new typ[100]; typ [] tabJednowymiarowa = new typ[100]; Tablica dwuwymiarowa typ tabDwuwymiarowa [] = new typ [10] [10]; typ [][] tabDwuwymiarowa = new typ[10][10];
Klasy typów danych Znajdują się w bibliotece standardowej java.lang.* Umożliwiają tworzenie obiektów przechowujących pole wskazanego typu podstawowego Posiadają zbiór metod operujących na wskazanym typie, np. uzyskanie reprezentacji znakowej (toString())
Boolean Klasa umożliwiająca stworzenie obiektu przechowującego pole o wartości typu podstawowego boolean Klasa ta daje liczne możliwości przetwarzania wartości typu boolean na inne String toString() Posiada również metody statyczne, np.: static Boolean valueOf(boolean b)
Boolean - przykład Boolean isdigit; isdigit = new Boolean(false); Boolean isdigit = new Boolean(false);
Byte Klasa umożliwiająca stworzenie obiektu przechowującego pole o wartości typu podstawowego byte Umożliwia liczne konwersje typu liczbowego byte do innych podstawowych typów liczbowych, np.: int intValue() float floatValue() long longValue() posiada również metody statyczne, np.: static byte parseByte(String s) static byte valueOf(String s)
Character Klasa umożliwiająca stworzenie obiektu przechowującego pole o wartości typu podstawowego char Zawiera pola i metod dotyczące obsługi standardowej strony kodowej platformy Javy czyli Unicodu static int getNumericValue(char ch) static boolean isLetter (char ch)
Integer, Long Klasy umożliwiające stworzenie obiektów przechowujących pola o wartościach podstawowych typów całkowitych int i long Zawierają metody do konwersji z i do różnych typów danych (w tym statyczne): static int parseInt(String s) - Integer long longValue() static Integer valueOf(String s) - Integer float floatValue()
Float, Double Klasy umożliwiające stworzenie obiektów przechowujących pola o wartościach podstawowych typów zmiennoprzecinkowych float i double Zawierają metody do konwersji z i do różnych typów danych (w tym statyczne): static float parseFloat(String s) – Float static double parseDouble(String s) - Double long longValue() static Float valueOf(String s) – Float static Double valueOf(String s) – Double float floatValue()
Operatory
Operatory to elementy języka służące do generacji nowych wartości na podstawie podanych argumentów wiążą się najczęściej z określonym działaniem na zmiennych prawie wszystkie operatory (z wyjątkiem: ‘=’, ‘==’, ‘!=’, ‘+’, ‘+=’) działają na podstawowych typach danych, a nie na obiektach
Klasy operatorów operatory negacji operatory matematyczne operatory przesunięcia operatory relacji operatory logiczne i bitowe operatory warunkowe operatory przypisania
Operatory negacji powodują zmianę wartości zmiennej na przeciwną pod względem znaku int a = 4; x = -a;
Operatory matematyczne służą do wykonywania operacji matematycznych na argumentach zalicza się do nich: mnożenie ‘*’ dzielenie ‘/’ modulo - reszta z dzielenia ‘%’ dodawanie ‘+’ odejmowanie ‘-‘
Operatory przesunięcia działają na bitach w ich reprezentacji poprzez całkowite typy podstawowe danych operator „<<„ powoduje przesunięcie w lewo o zadaną liczbę bitów, natomiast operator „>>„ powoduje przesunięcie w prawo o zadaną liczbę bitów, np.: int liczba = 20; int liczbaL = liczba << 2; int liczbaR = liczba >> 2;
Operatory relacji generują określony rezultat reprezentowany przez typ logiczny boolean w wyniku przeprowadzenia porównania zalicza się do nich: ‘a > b‘ - a większe od b ‘a < b’ - a mniejsze od b ‘a >= b‘ - a większe równe jak b ‘a < =b’ - a mniejsze równe jak b ‘a == b‘ - a identyczne z b ‘a != b’ - a różne od b
Operatory logiczne generują rezultat reprezentowany przez typ logiczny boolean ‘a && b’ - a i b (rezultatem jest true jeśli a i b są true) ‘a || b ‘ - a lub b (rezultatem jest true jeśli a lub b są true)
Operatory bitowe działają podobnie jak operatory logiczne lecz operują na bitach ‘&’ - bitowy AND ‘|’ - bitowy OR ‘^’ - bitowy XOR
Operator warunkowy jest skróconą wersją instrukcji warunkowej if wyrażenie_boolean ? wartość1 : wartość2; gdzie: wyrażenie_boolean oznacza operację generującą jako wynik true lub false; wartość1 oznacza działanie podjęte wówczas, gdy wynik wyrażenia jest true; wartość2 oznacza działanie podjęte wówczas, gdy wynik wyrażenia jest false.
Operator warunkowy - przykład String vader = "Vader"; String anakin = "Anakin"; String s = (vader.equals(anakin)) ? vader : anakin;
Operacje przypisania polegają na podstawieniu zmiennej (lewa strona - left value - Lvalue) danej wartości, lub wartości innej zmiennej albo wartości wynikowej operacji (prawa strona - right value - Rvalue) przykłady a = 12; a = b; a= a+b;
Instrukcje sterujące
Instrukcje sterujące służą do sterowanie przepływem wykonywania instrukcji zalicza się do nich: pętle umożliwiające iteracyjne wykonywanie kodu tak długo aż spełniony jest warunek instrukcje wyboru umożliwiające wybór kodu w zależności od podanego argumentu instrukcje warunkowe umożliwiające wykonanie kodu w zależności od spełnienia podanych warunków instrukcje powrotu umożliwiające przedwczesne zakończenie pętli lub bloku kodu
Pętla while powoduje wykonywanie wyrażenia tak długo dopóki rezultat wyrażenia logicznego jest true ilość iteracji jest nieokreślona
Pętla while while(wyrażenie_logicze) instrukcja; lub { instrukcje; }
Pętla do-while powoduje wykonywanie wyrażenia tak długo dopóki rezultat wyrażenia logicznego jest true ilość iteracji jest nieokreślona
Pętla do-while - przykład int i=0; do{ i++; System.out.println("Moc jest z Wami"); }while(i<10);
Pętla do-while do instrukcje; while(wyrażenie_logicze);
Różnice między pętlami while i do-while w pętli while warunek pętli sprawdzany jest na początku w pętli do-while warunek pętli sprawdzany jest na końcu pętla while może nie wykonać się ani razu pętla do-while musi wykonać się przynajmniej jeden raz
Pętla for Powoduje wykonanie wyrażenia tyle razy ile to wynika z warunku przedstawionego w wywołaniu pętli Warunek pętli for polega na określeniu wartości startowej iteracji, określeniu końca iteracji oraz kroku
Pętla for for(inicjowanie; wyrażenie_logicze ; krok) instrukcja; lub { instrukcje; }
Pętla for - przykład for (int i=0; i<10; i++) { System.out.println(„Niech moc będzie z Wami”); }
Instrukcja wyboru switch powoduje sprawdzenie stanu wyrażenia_wyboru (zmiennej liczbowej) i w zależności od jej stanu (wartości) wykonywane jest wyrażenie
Instrukcja wyboru switch switch(wyrażenie_wyboru) { case wartość1 : wyrażenie; break; case wartość2 : wyrażenie; break; case wartość3 : wyrażenie; break; case wartość4 : wyrażenie; break; // … default: wyrażenie; }
switch - przykład int test = System.in.read(); switch(test){ case 49: System.out.println("Wybrano 1"); break; case 50: System.out.println("Wybrano 2"); break; case 51: System.out.println("Wybrano 3"); break; case 52: System.out.println("Wybrano 4"); /* Brak break; program przejdzie do pola default i wykona odpowiednie instrukcje */ default: System.out.println("Wybrano cos"); }//koniec switch
Instrukcja warunkowa if sprawdza stan logiczny wyrażenia logicznego i jeżeli jest true to wykonywana jest instrukcja w gałęzi if, jeśli istnieje gałąź else i wyrażenie jest false to wykonywane jest wyrażenie po słowie kluczowym else
Instrukcja warunkowa if if (wyrażenie_logiczne) instrukcja; lub { instrukcje; }
Instrukcja warunkowa if if (wyrażenie_logiczne) instrukcja; else lub { instrukcje; }
Instrukcja powrotu return kończy metodę, w ciele której się znajduje i powoduje przeniesienie wartości wyrażenia do kodu wywołującego daną metodę. typ wartości wyrażenia instrukcji return musi być zgodny z typem zadeklarowanym w czasie definicji metody, w ciele której znajduje się instrukcja return składnia: return (wyrażenie);
Programowanie obiektowe
Cechy programowania obiektowego Enkapsulacja - ukrywanie pewnych pól lub metod obiektów danej klasy tak, aby były one (i ich modyfikacja) dostępne tylko metodom wewnętrznym danej klasy lub funkcjom z nią zaprzyjaźnionym
Cechy programowania obiektowego Polimorfizm - wykazywanie przez metodę różnych form działania w zależności od tego jaki typ obiektu jest wskazywany przez wskaźnik lub referencję
Cechy programowania obiektowego Dziedziczenie - stworzenie nowej klasy na bazie klasy (klas) już istniejącej (-cych)
Klasy Definicja klasy określa jej budowę i zachowanie [ModyfikatorKlasy] class NazwaKlasy [extends NadKlasa] [implements Interfejsy] { /* definicje metod i pól */ }
Klasy - przykłady class EmpInfo { String name; String designation; String department; } public class MyDate { int day, month, year; public void tomorrow() { // code to increment day
Modyfikator klasy abstract - klasa abstrakcyjna final – brak możliwości utworzenia klas pochodnych public – dostęp do klasy na zewnątrz pakietu private – dostęp do klasy wyłącznie wewnątrz pakietu
Pola ModyfikatorPola TypZwracanejWartości NazwaPola
Metody ModyfikatorMetody TypZwracanejWartości Nazwa (Typ Argument1, Typ Argument2, ...) [throws Wyjątki] { /* implementacja (kod źródłowy) metody */ }
Modyfikatory pól i metod public - dostęp dla innych metod spoza klasy protected – dostęp dla klas potomnych private – dostęp tylko dla metod dane klasy final – brak możliwości przesłaniania static - odwołanie odbywa się przez nazwę klasy synchronized – dostęp synchroniczny
Metody - przykład public int addDays(int days) { // Method code here }
Metody statyczne public class GeneralFunction { public static int addUp(int x, int y) { return x + y; } public class UseGeneral { public void method() { int a = 9; int b = 10; int c = GeneralFunction.addUp(a, b); System.out.println("addUp() gives " + c);
Argumenty metod Argumenty będące typami prostymi są przekazywane przez wartość Argumenty będące obiektami są przekazywane przez referencję Pola obiektu wewnątrz metody moą być zmieniane ale referencja jest niezmienna
Przeładowanie nazw metod Zdefiniowanie wielu metod o tej samej nazwie, np. public void println(int i) public void println(float f) public void println(String s) Warunki: muszą mieć różną listę argumentów (ilość, typy) mogą mieć różny typ zwracany
Konstruktor Metoda klasy wykonywana w momencie inicjalizacji obiektu tej klasy Musi posiadać nazwę identyczną z nazwą klasy Nie posiada typu zwracanego
Konstruktor - przykład public class Xyz { // member variables go here public Xyz() { // set up the object } public Xyz(int x) { // set up the object with a parameter
Przeładowanie konstruktora public class Employee { private String name; private int salary; public Employee(String n, int s) { name = n; salary = s; } public Employee(String n) { this(n, 0); public Employee() { this(“Unknown”);
Tworzenie i inicjalizowanie obiektów Do alokacji pamięci wykorzystywany jest operator new Wywołanie operatora new Xxxx() powoduje: zaalokowanie pamięci dla obiektu Xxxx wykonanie inicjalizacji pól zadeklarowanych w sposób jawny wywołanie konstruktora
Jawna inicjalizacja pól public class Initialized { private int x = 5; private String name = "Fred"; private MyDate created = new MyDate(); // Accessor methods go here ... }
Konstruktor domyślny Znajduje się w każdej klasie która nie posiada jawnie zadeklarowanego konstruktora Pozwala na tworzenie obiektów w sposób: new Xxxx() Jest niedostępny gdy klasa posiada zadeklarowany konstruktor
Klasy abstrakcyjne Posiadają modyfikator abstract Stosuje się wówczas, gdy na danym stopniu opisu ogólnego możliwych obiektów nie można podać rzeczywistej realizacji jednej lub wielu metod Posiadają deklarację metod bez ich implementacji Mogą zawierać pola i metody nieabstrakcyjne public abstract class Drawing { public abstract void drawDot(int x, int y); public void drawLine(int x1, int y1, int x2, int y2) { // draw using the drawDot() method repeatedly. }
Interfejsy Wszystkie metody są abstrakcyjne Zawiera pola typu static i final Zarówno pola jaki i metody są zadeklarowane jako publiczne Pozwala symulować wielokrotne dziedziczenie public interface Transparency { public static final int OPAQUE=1; public static final int BITMASK=2; public static final int TRANSLUCENT=3; public int getTransparency(); }
Interfejsy interface SayHello { void printMessage(); } class SayHelloImpl implements SayHello { void printMessage() { System.out.println("Hello");