• Nie Znaleziono Wyników

Agnieszka Nowak - Brzezińska

N/A
N/A
Protected

Academic year: 2021

Share "Agnieszka Nowak - Brzezińska"

Copied!
170
0
0

Pełen tekst

(1)

Agnieszka Nowak - Brzezińska

(2)

Wystarczy raz zapisać kod a program

można uruchomić wszędzie…

(3)

Java – język programowania stworzony przez James’a Goslinga i Patric’a Naughton’a z firmy Sun Microsystems.

Krótka historia języka:

1991 r. – Projekt „Green” – czyli niezależny od platformy i kompaktowy język

programowania tunerów telewizji kablowej.

1992 r. – wielofunkcyjny pilot tv oraz tv box z funkcją wideo na żądanie!

1993 – 1994 r. – 300 000 punktów Air Miles za loty w celu promocji technologii Green.

1995 r. – przeglądarka internetowa HotJava z obsługą apletów.

Pierwsza wersja (1.0) Javy (bo nazwa Oak była już zajęta).

1998 r. – Java 1.2 – GUI i funkcję graficzne – przemianowano na Java 2 SE ver. 1.2.

2004 r. – Java 1.5 – typy generyczne, pętla for each, dużo zmian – przemianowano na Java 5.0.

(4)

Źródło: K. Sierra, B. Bates. Head First Java. 2nd Edition. O’Reilly, USA.

(5)
(6)

Java rozróżnia wielkość liter – println, Println, PRINTLN to są 3 różne nazwy!

Główny plik źródłowy zawierający kod programu (z rozszerzeniem .java) musi nazywać się tak samo jak nazwa klasy.

Wszystko w Javie musi się znajdować w jakieś klasie!

Nazwa klasy musi się zaczynać od litery, po której mogą wystąpić dowolne kombinacje liter i cyfr. Nazwa nie może być zarezerwowanym słowem kluczowym.

Funkcja (metoda main) musi się znajdować w pliku źródłowym klasy, która chcemy uruchomić.

(7)

Typy komentarzy:

Jednolinijkowe (liniowe)

// to jest komentarz składający się z 1 linii

Wielolinijkowe (blokowe)

/* tutaj

komentarz mający wiele linii */

Komentarzy blokowych NIE wolno zagnieżdżać /* /* błąd */ */

Automatyczne generowanie dokumentacji /** Jest to nasz pierwszy program

@version 1.01

@author Tomasz Jach

*/

(8)
(9)
(10)

Deklarujemy referencję zmiennej

Tworzymy obiekt

Połączenie odwołania do obiektu i referencji

(11)
(12)

Należy zalogować się jako administrator.

Przejdź do panelu sterowania, przełącz na widok klasyczny i kliknij dwukrotnie ikonę Systemu. W systemach Windows NT/2000/XP od razu otworzy się okno Właściwości systemu. W systemie Windows Vista należy kliknąć „Zaawansowane ustawienia systemu”.

W oknie dialogowym Właściwości systemu kliknij kartę Zaawansowane, a następnie przycisk Zmienne środowiskowe. W oknie tym znajdź zmienną o nazwie Path. Kliknij przycisk Edytuj i dodaj tam katalog jdk\bin na początku ścieżki i wpis ten oddziel od reszty wpisów średnikiem, jak poniżej:

C:\jdk\bin; inne wpisy

Zapisz ustawienia. Każde nowe okno konsoli będzie wykorzystywać prawidłową ścieżkę.

(13)
(14)
(15)
(16)

W Javie każdy typ int to liczba 32bitowa, w

C/C++ to była 16-to albo 32-u albo dowolna inna liczba. Teraz nie ma przynajmniej

problemów z przenoszeniem kodu.

(17)

Interpreter Javy może wykonać kod bajtowy Javy bezpośrednio na urządzeniu, na którym interpreter zainstalowano.

Obecnie kod bajtowy jest tłumaczony przez kompilator JIT (just-in-time compiler) na kod maszynowy.

(18)
(19)
(20)
(21)
(22)

Skrót JVM (ang. Java Virtual Machine),

wirtualny (programowy) procesor, który

wykonuje kod pośredni ładowany z plików class lub archiwów z lokalnego systemu plików lub poprzez sieć

maszyna wirtualna implementowana jest jako samodzielnie uruchamiany program lub

wbudowywana np. w przeglądarkę WWW albo w system operacyjny (statycznie jako moduł lub biblioteka łączona dynamicznie)

(23)

Podstawowa wersja środowiska Javy dostarczana jest przez firmę Sun Microsystems w postaci pakietu narzędzi Java 2 Software Developers Kit

Standard Edition (Java 2 SDK SE)

Zestaw przygotowywany jest dla różnych systemów operacyjnych

Dawniej nazywany był Java Developers Kit (JDK)

istnieje rozbudowana wersja pakietu Enterprise Edition zawierająca

dodatkowe narzędzia oraz biblioteki

środowisko zawierające tylko implementację maszyny

wirtualnej dla określonego systemu operacyjnego i biblioteki standardowe Javy, bez narzędzi programistycznych,

nazywane jest Java Runtime Environment i służy tylko do uruchamiania programów utworzonych w Javie

(24)

w zestawie J2SDK kompilatorem jest program o nazwie javac (Java Compiler)

pliki wynikowe mogą być pogrupowane

logicznie w pakiet, który fizycznie może być zlokalizowany w pewnej drzewiastej

strukturze katalogowej

pakiet może być zarchiwizowany do formatu zip lub jar np. za pomocą programu

narzędziowego jar dostarczanego w zestawie J2SDK

(25)

Małe programy z interfejsem graficznym uruchamiane przez przeglądarkę WWW z wbudowaną obsługą Javy lub specjalną przeglądarkę apletów o nazwie

appletviewer dostarczaną w pakiecie J2SDK;

informacja o tym skąd i jaki plik class lub jar załadować wbudowywana jest w stronę WWW w postaci specjanego znacznika HTML, który

dodatkowo może zawierać parametry

uruchomieniowe apletu, aplikacje graficzne, lub tekstowe programy uruchamiane przez maszynę

wirtualną pracującą z poziomu systemu operacyjnego

(26)

Implementacją maszyny wirtualnej w pakiecie J2SDK jest program java uruchamiany z linii komend wraz z parametrem określającym

plik class lub jar w lokalnym systemie plików, od którego zaczyna się wykonywanie aplikacji

serwlet program wykonywany po stronie serwera

midlet program wykonywany w urządzeniu przenośnym

(27)

jedna z klas musi zawierać metodę public static void main(String[ ] args)

jeśli jest to klasa publiczna, nazwa tej klasy musi być taka sama jak nazwa pliku, w której jest zdefiniowana

po kompilacji pliku źródłowego .java do Bkodu (polecenie javac) powstają pliki .class (dla każdej klasy osobny plik)

poleceniem java klasa .class zostaje załadowana

przez JVM (Java Virtual Machine) i sterowanie zostaje przekazane do metody main( ), gdzie zaczyna się

„życie”: tworzenie obiektów, odwołania do innych klas aplikacji

(28)

class Aplikacja1 {

public static void main(String[] args) { System.out.println("Hello World!");

} }

Przy założeniu, że kod aplikacji zapisany został w pliku Aplikacja1.java

kompilujemy go kompilatorem javac wydając polecenie:

javac Aplikacja1.java

W wyniku kompilacji otrzymamy plik z kodem pośrednim Aplikacja1.class

który możemy uruchomić wykorzystując interpreter java java Aplikacja1

(29)

<applet>

<html>

<head>

<title>Aplet1</title></head

>

<body>

<applet code="Aplet1.class"

width="400"

height="200">

</applet>

</body>

</html>

import java.applet.*;

import java.awt.*;

public class Aplet1 extends Applet {

public void init() {

add(new Label(„Hello world”));

} }

Plik źródłowy:

Applet1.java

javac Aplet1.java

Applet1.class

Plik HTML:

Applet.html

Applet.html

(30)

Nazwa Przykładowe wartośdi Objaśnienie CODE CODE="Pusty.class" określa nazwę pliku

zawierającego kod bajtowy apletu

WIDTH HEIGHT

WIDTH=100 HEIGHT=200

określają wymiar apletu w pikselach

HSPACE VSPACE

HSPACE=10 VSPACE=20

określają w pikselach odstęp pomiędzy apletem a otaczającym go tekstem CODEBASE CODEBASE=

"C:/Aplety"

Określa ścieżkę dostępu do tego pliku. Jeżeli zbiór z kodem bajtowym jest w tej samej kartotece, co dokument

HTML, to nie trzeba podawad ścieżki dostępu. Wartością CODEBASE może byd również adres sieciowy URL.

(31)

Jeżeli kod HTML strony WWW został zapisany w pliku Aplet1.html to działanie apletu możemy sprawdzić ładując stronę do przeglądarki lub korzystając z

interpretera appletviewer poprzez podanie komendy:

appletviewer Aplet1.html

Wyszukiwaniem i ładowaniem plików zawierających kod pośredni zajmuje się moduł ładujący (bytecode

loader, classloader)

klasy, o ile to możliwe, ładowane są w pierwszej

kolejności z lokalnego systemu plików a następnie z sieci

(32)

Przed rozpoczęciem wykonywania załadowanego kodu

bajtowego jest on sprawdzany przez weryfikator w czterech etapach

1. weryfikacja pliku klasy: weryfikacja sygnatury pliku i jego struktury

2. weryfikacja tworzenia podklas, stałych, wskaźników do obszarów pamięci

3. weryfikacja kodu bajtowego: analiza metod, kontrola argumentów, inicjalizacji zmiennych, analiza stosu

argumentów, badanie możliwości wystąpienia nadmiaru i niedomiaru podczas operacji arytmetycznych

4. sprawdzenie podczas wykonania typu danych oraz dostępu:

analiza poziomów dostępu do składowych prywatnych i chronionych

(33)

Maszyna wirtualna może zawierać zintegrowany

kompilator JIT, który "w locie" (JustInTime) generuje kod wykonywalny specyficzny dla danego komputera na podstawie kodu pośredniego.

Przy pierwszym uruchomieniu kod pośredni trafia wprost do interpetera, ale jest kompilowany i

zapamiętywany w postaci kodu wynikowego.

Kolejne odwołanie do tego kodu powoduje, że

wykorzystywany jest kod wynikowy, co przyśpiesza działanie programu nawet 20krotnie

(34)

menedżer bezpieczeństwa jest klasą implementującą powłokę ochronną w układzie maszyna wirtualna/przeglądarka

określa i nadzoruje politykę dostępu przeglądarki do zasobów lokalnych i sieciowych

menedżer bezpieczeństwa musi wyrazić zgodę na uzyskanie przez aplet dostępu do następujących zasobów:

1. komunikacji sieciowej,

2. danych w lokalnym systemie plików, 3. procesów systemu operacyjnego, 4. modułu ładowania,

5. bibliotek Javy

przy standardowych ustawieniach aplety załadowane przez sieć nie mają np. dostępu do lokalnego systemu plików i mogą nawiązywać połączenia sieciowe tylko z serwerem, z którego zostały

załadowane.

aplikacje nie podlegają tym ograniczeniom i mogą uzyskiwać dostęp do dowolnych zasobów lokalnych i sieciowych

(35)

Ścieżka (bezwględna) do katalogu jdk/bin powinna być umieszczona w zmiennej systemowej PATH

javac kompilator

Składnia wywołania:

javac [opcje] [plikiźródłowe]

[@plikzlistąplikówźródłowych]

pliki źródłowe z rozszerzeniem java mogą być wymienione w linii komend lub zebrane w listę rozdzieloną odstępami i/lub znakami nowego

wiersza zapisaną w pliku, którego nazwa podawana jest po znaku @

(36)

w wyniku kompilacji powstają pliki z kodem pośrednim o rozszerzeniu class.

każdy plik class zawiera jedną skompilowaną klasę lub interfejs

program w języku Java jest zbiorem definicji klas i interfejsów

javac kompilator

Program w języku Java może być zapisany w jednym pliku lub w wielu plikach przy czym:

w jednym pliku źródłowym może znajdować się co najwyżej jedna klasa publiczna

jeżeli plik źródłowy zawiera definicję klasy

publicznej, to jego nazwa musi być identyczna z nazwą tej klasy (wielkość liter jest istotna).

(37)
(38)
(39)

Składnia wywołania:

java [opcje] nazwaklasy [argumenty]

jako parametr podawana jest nazwa klasy (bez

rozszerzenia class), od której zaczyna się wykonanie aplikacji. Klasa taka nazywana jest klasą startową

java interpreter aplikacji

java [opcje] jar plik.jar [argumenty]

wskazywany jest plik archiwum z rozszerzeniem jar,

który zawiera klasę startową, inne klasy aplikacji oraz pliki zasobów (grafiki, dźwięki i.t.p.).

(40)

Składnia wywołania:

appletviewer [opcje] url

interpreter apletów pozwala uruchamiać

aplety bez korzystania z przeglądarki WWW

jako parametr podawany jest url strony WWW

jeśli w stronę WWW wbudowanych jest kilka apletów, to dla każdego z nich otwierane jest osobne okno interpretera

(41)

pakiet jest mechanizmem łączenia w pewną całość logicznie powiązanych klas i interfejsów

zapewniania kontrolę dostępu do klas i interfejsów oraz ich składowych pozwala unikać kolizji nazw

biblioteki Javy zorganizowane są w pakiety

Przynależność klas i interfejsów zdefiniowanych w danym pliku do konkretnego pakietu możemy

określić podając jako pierwszy wpis w pliku źródłowym deklarację pakietu

package nazwapakietu; dalszaczęśćplikuźródłowego

(42)

pakiety mogą zawierać podpakiety i tworzyć hierarchie zorganizowaną w strukturę drzewa

struktura ta jest mapowana na strukturę katalogów

katalogi zawierają skompilowane pliki klas i interfejsów

(43)
(44)

programy mogą wykorzystywać klasy i interfejsy z istniejących pakietów deklarując ich import

można importować wszystkie klasy i interfejsy

danego pakietu podając w deklaracji importu symbol

* na końcu nazwy pakietu

deklaracja z symbolem* oznacza, że wykorzystane zostaną z danego pakietu tylko te definicje klas i interfejsów, które są niezbędne do skompilowania i uruchamiania programu

jeśli nie podano żadnej deklaracji importu, to i tak

domyślnie zawsze importowany jest pakiet java.lang.*

(45)
(46)

Kod bajtowy może być tłumaczony w locie (w trakcie działania programu) na kod

maszynowy przeznaczony dla określonego procesora, na którym działa aplikacja.

(47)

Korzyści płynące z wielowątkowości to lepsza interaktywność i działanie w czasie rzeczywistym.

W Javie realizacja wielowątkowości jest o wiele prostsza niż w innych językach. Wątki w Javie mogą korzystać z systemów wieloprocesorowych, jeśli podstawowy system operacyjny to umożliwia.

(48)

Java jest bardziej dynamicznym językiem niż C i C++ pod wieloma względami. Została tak zaprojektowana aby dostosowywać się do ewoluującego środowiska. Do bibliotek można bez przeszkód dodawać nowe metody i zmienne egzemplarzy, nie wywierając żadnego wpływu na klienty.

(49)

Założenie jest proste: użytkownik pobiera kod bajtowy z internetu i uruchamia go na własnym urządzeniu.

Programy napisane w Javie, które działają na stronach internetowych, noszą nazwę apletów Javy.

Aby używać apletów, wystarczy mieć przeglądarkę

obsługującą Javę, w której można uruchomić kod bajtowy tego języka.

Nie trzeba nic instalować.

Dzięki temu, że forma Sun udziela licencji na kod

źródłowy Javy i nie zezwala na wprowadzanie żadnych zmian w języku i bibliotece standardowej, każdy aplet powinien działać w każdej przeglądarce która obsługuje Javę.

Najważniejsze jest jednak to, że dzięki zabezpieczeniom maszyny wirtualnej nie trzeba obawiać się ataków ze

strony złośliwego kodu.

(50)

Pobieranie apletu odbywa się w podany sposób jak wstawianie obrazu na stronę internetową.

Aplet integruje się ze stroną a tekst otacza go ze wszystkich stron jak obraz. Różnica polega na tym, że ten obraz jest żywy.

Reaguje na polecenie użytkownika, zmienia wygląd oraz przesyła dane pomiędzy komputerem, na którym został uruchomiony a tym, ż którego pochodzi.

(51)

Zmienna – konstrukcja programistyczna posiadająca swoją

unikalną nazwę, oraz typ danych jakie zmienna jest w stanie przechowywać.

Każda zmienna przed wykorzystaniem w programie musi zostać zadeklarowana (stworzona). Deklaracja polega na podaniu typu i nazwy zmiennej w formie:

typ_zmiennej nazwa_zmiennej;

np. int suma;

Aby naraz zadeklarować wiele zmiennych tego samego typu oddzielamy ich nazwy przecinkiem:

np. int suma, pensja, obroty;

Na końcu każdej deklaracji musi znajdować się średnik!

Nazwa zmiennej może się składać z liter (małych lub wielkich), cyfr, oraz znaku podkreślenia, ale nie może się zaczynać od cyfry.

(52)

Aby przypisać zmiennej jakąś określoną wartość wpisujemy:

nazwa_zmiennej = wartość;

np. suma = 100;

Pierwsze przypisanie wartości zmiennej nazywa się jej inicjalizacją. Inicjalizacja zmiennej może się odbyć w dowolnym miejscu programu po jej wcześniejszym zadeklarowaniu. Może też wystąpić równocześnie z deklaracją:

int suma = 100;

(53)

W Javie każda zmienna musi mieć określony typ. Deklaracja zmiennej polega na napisaniu nazwy typu, a po nim nazwy zmiennej.

Double pensja;

Int liczbaDniPracujacych;

Long liczbaMieszkancowZiemi;

Boolean czyZdanyEgzamin;

(54)

Po zadeklarowaniu zmiennej trzeba zainicjować ją za pomocą instrukcji

przypisania – nie można użyć wartości niezainicjowanej zmiennej.

Int liczbaDniPrzepracowanych;

System.out.println(liczbaDniPrzepracowanych);

Błąd – zmienna nie została zainicjowana !!!

(55)

lub

Int liczbaDniPrzepracowanych;

liczbaDniPrzepracowanych = 12;

Int liczbaDniPrzepracowanych = 12;

(56)

Java jest językiem o ścisłej kontroli typów.

Oznacza to, że zmienna każda musi mieć określony typu. Istnieje 8 podstawowych typów. 4 z nich reprezentują liczby całkowite, dwa – liczby rzeczywiste, jeden o nazwie char

zarezerwowano dla znaków

reprezentowanych przez kody liczbowe systemu Unicode, zaś ostatni jest logiczny (boolean).

(57)

To liczby pozbawione części ułamkowej.

Zaliczają się do nich także liczby ujemne.

Typ Liczba

bajtów zakres

Int 4 -2147483648 do 2 147483647

Short 3 -32 768 do 32 767

Long 8 9 223 372 036 854 775 808 do 9 223 372 036 854 775 807

byte 1 -128 do 127

(58)

Służą do przechowywania liczb z częścią ułamkową.

Typ Liczba

bajtów zakres

Float 4 Około 3,40282345E+38F (6-7 znaczących cyfr dziesiętnych)

doubl

e 8 Około 1,79769313486231570E + 308 (15 znaczących cyfr dziesiętnych)

(59)

Typ char służy do reprezentacji pojedynczych znaków. Mogą to być stałe znakowe opatrzone apostrofami np. ‘A’, ‘z’, ‘0’. Typ ten zajmuje 16 bitów.

Można również wyświetlać symbole zakodowane w Unicode (których wartości mieszczą się w zakresie \u0000 do \uFFFF). Przykładowo

\u03C0 to grecka litera .

Ponadto wyróżnia się symbole reprezentujące znaki specjalne jak znak nowej linii czy tabulacja:

\n – nowa linia

\t – tabulacja

\b – backspace

\r – powrót karetki

\” – cudzysłów

\’ – znak apostrofu

\\ - lewy ukośnik (ang. backslash)

(60)

Może przechowywać dwie wartości: true i false.

Służy do sprawdzania warunków logicznych.

Wartości logicznych nie można konwertować na wartości całkowitoliczbowe.

(61)

+ (dodawanie)

- (odejmowanie)

* (mnożenie)

/ (dzielenie całkowitoliczbowe)

% (dzielenie modulo)

++ (inkrementacja)

-- (dekrementacja)

(62)

Wynik:

(63)

Operator inkrementacji (++) zwiększa wartość zmiennej o jeden, podczas gdy operator

dekrementacji (--) zmniejsza wartość zmiennej o jeden.

Oba operatory mogą występować w dwóch formach:

Przedrostkowej (++x).

Przyrostkowej (x++).

Obie postacie powodują zwiększenie zapamiętanej w zmiennej wartości o jeden, ale w przypadku formy przedrostkowej odbywa się to przed jej

wykorzystaniem (przed zwróceniem jej wartości), a w przypadku formy przyrostkowej dopiero po

wykorzystaniu danej zmiennej.

(64)

Wynik:

(65)

Jeśli w wyniku operacji w dalszej części programu na zmiennej liczbowej przekroczymy

dopuszczalny zakres przyjmowanych przez nią wartości to nie spowoduje to błędu kompilacji!

Przekroczenie dopuszczalnej wartości nie

powoduje błędu a jedynie „zawinięcie” liczby zgodnie z zasadą:

INT_MAX + 1 = INT_MIN INT_MAX + 2 = INT_MIN +1

INT_MIN – 1 = INT_MAXoraz INT_MIN – 2 = INT_MAX + 1

(66)

Operatory bitowe służą do wykonywania operacji na bitach. Są one następujące:

Operator Nazwa Przykład

& Bitowe AND x & y

| Bitowe OR x | y

~ Bitowe NOT ~x

^ Bitowy XOR x ^ y

<< Przesunięcie arytmetyczne w lewo x << y

>> Przesunięcie arytmetyczne w prawo x >> y

>>> Przesunięcie arytmetyczne w prawo z wypełnieniem zerami

x >> y

(67)

Operacje logiczne wykonujemy na

argumentach, które przyjmują jedną z dwóch możliwych wartości logicznych: true lub false.

Wyróżniamy 3 operatory logiczne:

Operator Nazwa Przykład

&& Logiczny AND x && y

|| Logiczny OR x || y

! Logiczny NOT !x

(68)

Operatory przypisania są operatorami dwuargumentowymi

i powodują przypisanie operandowi lewostronnemu wartości operandu prawostronnego.

Argument 1 Operator Argument 2 Znaczenie

x = y x = y

x += y x = x + y

x -= y x = x – y

x *= y x = x * y

x /= y x = x / y

x %= y x = x % y

x <<= y x = x << y

x >>= y x = x >> y

x >>>= y x = x >>>y

x &= y x = x & y

x |= y x = x | y

x ^= y x = x ^ y

(69)

Operatory porównania służą do porównania

operandów. Zwracają one wartość true lub false.

Przykład:

Wynikiem działania arg1 == arg2 będzie true jeśli oba argumenty są sobie równe. W przeciwnym przypadku wynikiem będzie false.

Operator Wykonywane działanie Przykład

== Równość x == y

!= Nierówność x != y

< Mniejszość x < y

> Większość x > y

<= Mniejszość lub równość x <= y

>= Większość lub równość x >= y

(70)

Typ operatora Symbol operatora Przyrostkowe x++ x --

Unarne ++x --x +x -x ~ ! Multiplikatywne * / %

Addytywne + -

Przesunięcia bitowe << >> >>>

Relacyjne < > <= >= instanceof

Równości == !=

Bitowy AND &

Bitowy XOR ^

Bitowy OR |

Logiczny AND &&

Logiczny OR ||

Warunkowy ? :

Przypisania = += -= *= /= %= &= ^= |== <<= >>= >>>=

Wszystkie operatory dwuargumentowe (za wyjątkiem op. przypisania) o jednakowym priorytecie są sprawdzane od lewej do prawej. Operatory przypisania są oceniane od prawej do lewej.

(71)
(72)
(73)

== (operator równości)

!= (operator nierówności)

> (większości)

< (mniejszości)

>= (większe bądź równe)

<= (mniejsze bądź równe)

&& (koniunkcja logiczna)

|| (alternatywa logiczna)

! (negacja)

(74)

Wartością tego wyrażenia jest wyrażenie1 jeśli warunek ma wartość true, lub

wyrażenie2 gdy warunek ma wartość false. Warunek ? Wyrażenie1: wyrażenie2

(75)

Klasa Math zawiera zestaw funkcji matematycznych, które mogą być bardzo przydatne przy pisaniu niektórych rodzajów programów.

int x=4;

float pierwZx= Math.sqrt(x);

System.out.println(pierwZx);

Wynik : 2.0

(76)
(77)

double x=9.997;

Int nx = (int) z;

Wynik : 9

(78)

W javie łańcuchy składają się z szeregu

znaków Unicode. Nie ma wbudowanego typu String, ale standardowa biblioteka Javy

zawiera predefiniowaną klasę o takiej właśnie nazwie. Każdy łańcuch w cudzysłowach jest obiektem klasy String:

String e=„”;

String powitanie= ”Witaj”;

(79)

Aby wydobyć z łańcucha jakiś podłańcuch, należy użyć metody substring klasy String.

Np..

String powitanie= ”Witaj”;

String s= powitanie.substring(0,3);

Wit

(80)

Metoda equals

String imie1= ”Aleks”;

String imie2= „Aleksandra”;

Imie2.equals(imie1);

(81)
(82)

Instrukcje warunkowe służą do sprawdzania warunków. W zależności od tego czy warunek jest prawdziwy, czy fałszywy, wykonywane są różne bloki instrukcji. Ogólna postać instrukcji warunkowej jest następująca:

if (warunek) {

//instrukcje do wykonania, gdy warunek jest prawdziwy }else {

//instrukcje do wykonania, gdy warunek jest fałszywy }

Blok else jest blokiem opcjonalnym. Prawdziwa jest zatem instrukcja:

if (warunek) {

//instrukcje do wykonania, gdy warunek jest prawdziwy }

(83)

Często przydatna jest również zmodyfikowana postać instrukcji

warunkowej, sprawdzająca warunki podrzędne, w przypadku gdy nie jest spełniony warunek nadrzędny.

if (warunek1) {

//instrukcje do wykonania, gdy warunek1 jest prawdziwy.

}else if(warunek2) {

//instrukcje do wykonania, gdy warunek2 jest prawdziwy, natomiast warunek1 jest fałszywy.

}else if(warunek3) {

//instrukcje do wykonania, gdy warunek3 jest prawdziwy, natomiast warunek1 oraz warunek2 jest fałszywy.

}else {

//instrukcje do wykonania, gdy wszystkie warunki są fałszywe.

}

(84)
(85)

Instrukcja switch pozwala w wygodny sposób sprawdzić ciąg warunków i wykonać różny kod w zależności od tego czy są one fałszywe czy prawdziwe. Jej postać jest następująca:

(86)
(87)

Operator warunkowy jest postaci:

warunek ? wartość1 : wartość2;

Co należy rozmieć jako: jeśli warunek jest prawdziwy to podstaw za wartość wyrażenia wartość1, w przeciwnym wypadku podstaw za wartość wyrażenia wartość2.

Można go traktować jako skróconą wersję instrukcji warunkowej if. Przykład:

(88)

Pętla while wykonuje daną instrukcję lub blok instrukcji tak długo jak długo warunek jest

spełniony (ma wartość true). Ogólna postać pętli while jest następująca:

while (warunek) instrukcja;

Pętla while bada prawdziwość warunku jeszcze przed wykonaniem dalszego kodu (na samym jej początku), dlatego też, jeśli warunek ma wartość false to instrukcje zawarte w tej pętli nigdy nie zostaną wykonane.

(89)

Można też tak:

(90)

Pętla do while jest odmianą pętli while, a jej ogólna postać jest następująca:

do

instrukcja;

while(warunek);

Co należy rozumieć jako: Wykonuj instrukcję dopóki warunek jest prawdziwy. Jako, iż

warunek pętli sprawdzany jest na końcu, wykona się ona zawsze przynajmniej raz!

(91)

ALBO…

(92)

Ogólna postać pętli for jest następująca:

for (wyrażenie początkowe; wyrażenie warunkowe; wyrażenie modyfikujące) instrukcja_do_wykonania;

W miejsce wyrażenia początkowego wstawiane jest wyrażenie stosowane do zainicjalizowania zmiennej służącej jako licznik wykonań pętli. Wyrażenie

warunkowe określa jaki warunek musi być spełniony by przejść do kolejnego przebiegu pętli. Wyrażenie

modyfikujące natomiast używane jest do modyfikacji wartości zmiennej będącej licznikiem pętli.

(93)

LUB

Wartość zmiennej i widoczna poza blokiem pętli Wartość zmiennej i widoczna tylko w bloku pętli

(94)

Instrukcja break powoduje przerwanie

wykonywania pętli i opuszczenie jej bloku.

Nie ma warunku zatrzymania pętli

A i tak zadziała…

(95)

Wynik

(96)

Instrukcja continue powoduje przejście do kolejnej iteracji danej pętli (chyba, że była to jej ostatnia iteracja).

Wynik

(97)

Instrukcje break i continue mają również postać w połączeniu z etykietami.

Etykieta to wyznaczone miejsce w kodzie

programu. Etykietę definiuje się przez podanie jej nazwy zakończonej znakiem dwukropka

break etykieta powoduje przerwanie wszystkich pętli znajdujących się za etykietą (innymi słowy przerwij działanie pętli i idź do etykieta1).

continue etykieta powoduje przerwanie bieżącej iteracji pętli przejście do miejsca oznaczonego etykietą. Następnie następuje ponowne wejście do pętli znajdującej się tuż za etykietą!

(98)

Wynik

Wynik Widać różnicę?

(99)

char charAt(int index)

int compareTo(String anotherString) {<0;0;>0}

boolean endsWith(String suffix)

int indexOf(int ch, int fromIndex)

int indexOf(String str)

int length()

String replace(char oldChar, char newChar)

String substring(int beginIndex)

String toLowerCase()

String toUpperCase()

String valueOf( … )

(100)

System.out.println("abc");

String cde = "cde";

System.out.println("abc" + cde);

String c = "abc".substring(2,3);

String d = cde.substring(1, 2);

int dlugosc = cde.length();

(101)

boolean nextBoolean()

double nextDouble()

float nextFloat()

int nextInt()

int nextInt(int n) – uwaga na zakres: [0;n)

long nextLong()

void setSeed(long seed)

(102)

// Stworzenie obiektu klasy Random, który posłuży do losowania liczb Random r = new Random();

// Losowanie liczby z zakresu [0,10] do zmiennej a.

int a = r.nextInt(11); // deklaracja i definicja zmiennej

// Losowanie liczby z zakresu [-10,22] i wyświetlenie jej na konsolę.

System.out.println( r.nextInt(33)-10 );

/* 33, bo w przedziale [-10,22] są 33 liczby i -10 bo to najmniejsza liczba w zakresie. */

(103)
(104)

Tablica jest rodzajem struktury danych

będącą zestawem elementów tego samego typu. Dostęp do każdego z tych elementów można uzyskać za pomocą jego indeksu w postaci liczny int. Jeśli np. a będzie tablicą

liczb całkowitych to a[i] jest i-tym elementem tej tablicy. Deklaracja zmiennej tablicowej

polega na określeniu typu tablicy i nazwy zmiennej.

Int[] a;

Int [] a = new int [100]; Powyższa instrukcja tworzy

tablicę, w której można zapisać 100 liczb całkowitych.

(105)

Elementy tablicy numerowane są od 9.

Tablicę można zapełnić wartościami np. za pomocą pętli:

Int [] a = new int [100];

For (int i=0; i100; i++) A[i]=i

Próba dostępu do elementu o indeksie 100 lub większym w tablicy zawierającej 100 elementów zakończy się spowodowaniem wyjątku ArrayIndexOutOfBounds (indeks spoza przedziału tablicy).

(106)

Informację o liczbie elementów tablicy można uzyskać za pomocą odwołania

nazwaTablicy.length

Int [] a = new int [100];Rozmiaru tablicy nie można zmienić !

For (int i=0; i<a.length; i++) A[i]=i

(107)

Służą do reprezentacji tabel i innych bardziej złożonych struktur danych. Aby uzyskać

dostęp do elementu tablicy wielowymiarowej należy użyć więcej niż jednego indeksu.

Int [][] a = new int [4][2];

Int [][] tablica = {

{16,3}, {9,7}, {6,3}, {5,12}

}

(108)
(109)
(110)
(111)

System.out.println("\nTablica poszarpana");

int [][] tabSZ = new int[10][];

// 8 wierszy, ?? kolumn

for(int i=0; i<tabSZ.length; i++) tabSZ[i] = new int[i];

/*w każdym wierszu tyle kolumn jaki jest numer wiersza */

//Wyświetlanie

for(int i=0; i<tabSZ.length; i++){ // "Przejście" przez wiersze

for(int j=0; j<tabSZ[i].length; j++)//"Przejście" przez kolumny System.out.print(tabSZ[i][j]+" ");

System.out.println();

// Koniec kolumn w danym wierszu - nowa linia }

(112)

Tablice można kopiować jedną instrukcją:

arraycopy(Object src, int srcPos,

Object dest, int destPos, int length)

Co otrzymamy po wykonaniu takiego czegoś?

char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' };

char[] copyTo = new char[7];

System.arraycopy(copyFrom, 2, copyTo, 0, 7);

System.out.println(new String(copyTo));

(113)

String napis = „To jest napis”;

napis.length() - to jest funkcja zwracając nam długość

Jej definicja mogła by wyglądać tak:

int length(String arg)

(114)

Jeśli mamy jakiś kawałek kodu, który często wykorzystujemy

Jeśli często obliczamy lub potrzebujemy

dostać efekt wywołania jakiegoś fragmentu kodu

(115)

int dodaj( int l1, int l2 )

{

int wynik;

wynik = l1 + l2;

return wynik;

}

Funkcja zwraca wartość typu int

Funkcja nazywa się

„dodaj”

Funkcja przyjmuje dwa parametry typu int: l1, l2

Funkcja zwraca nam sumę tych

dwóch parametrów

(116)

package jbPack;

import java.util.*;

public class Program {

// Gdzieś tu muszą być funkcje

public static void main(String[] args) { // Tutaj nie

}

// Ale tutaj tak }

(117)

package jbPack;

import java.util.*;

public class Program {

int dodaj( int l1, int l2 ) { int wynik;

wynik = l1 + l2;

return wynik;

};

public static void main(String[] args) {

System.out.println(„Suma 4 i 5 wynosi: „ + dodaj(4,5));

} }

(118)

Jakaś funkcja:

void głupiaFunkcja( int arg ){

arg += 1;

}

Gdzieś w main():

int wartosc = 10;

System.out.println( wartosc );

głupiaFunkcja( wartosc );

System.out.println( wartosc );

Wynikiem będzie dwukrotne wyświetlenie 10!

(119)

8. Napisz funkcję, która w parametrze otrzymuje tablicę dwuwymiarową (o nieznanym rozmiarze) a w wyniku zwraca liczbę elementów dodatnich w tej tablicy.

9. Napisz funkcję, która dostaje trzy parametry:

dwa znaki zn1, zn2 i jedną liczbę zak [4;8].

Funkcja ma zwrócić napis o długości zak i losowo wypełnioną znakami zn1, zn2.

10. Napisz funkcję, która dostaje jeden parametr int dzielnik. Funkcja ma wypisywać na ekran

wszystkie liczby mniejsze od 100, a podzielne przez dzielnik

(120)

Schemat blokowy

Obliczenia Wejście /

Wyjście

Start

Alterna- tywa

Koniec

(121)
(122)
(123)

Program wczytujący liczby tak długo dopóki nie zostanie podana liczba 0.

Program podaje na końcu sumę tak wczytanych liczb.

(124)
(125)

BEGIN

Read(x);

Read(y);

suma := x + y;

Write(suma);

END.

(126)

BEGIN

Read(dzielna);

Read(dzielnik);

IF(dzielnik != 0) THEN

BEGIN

iloraz := dzielna / dzielnik write(‘Wynik wynosi’,

iloraz);

ELSEEND

write(‘Błąd dzielenia przez 0!’);

END

(127)

W celu wyświetlenia wartości zmiennych korzystamy ze znanej już instrukcji:

System.out.println(zmienna_do_wyswietlenia);

Przykładowo aby wyświetlić zawartość zmiennej suma:

int suma = 100;

System.out.println(suma);

Aby wyświetlić jakiś napis, podajemy go jako argument w/w instrukcji opatrzony w cudzysłów:

System.out.println(”Jakiś napis do wyświetlenia”);

Można połączyć wyświetlanie napisu i wartości zmiennych za pomocą operatora łączenia +:

System.out.println(”Wartość zmiennej suma wynosi” + suma);

(128)

Aby wyświetlić zawartość dwóch zmiennych w jednej linii można posłużyć się instrukcją:

System.out.print(zmienna);

Przykładowo:

int zawodnik = 1;

double czas = 33;

System.out.print(” Zawodnik nr ”);

System.out.print(zawodnik);

System.out.print(” miał czas ”);

System.out.println(czas);

LUB użyć operatora łączenia +

System.out.println(” Zawodnik nr ” + zawodnik + ” miał czas ” + czas);

(129)

Wszystkie sekwencje znaków specjalnych przedstawionych przy okazji omówienia typu char działają również na

łańcuchach znaków.

\n – nowa linia

\t – tabulacja

\b – backspace

\r – powrót karetki

\” – cudzysłów

\’ – znak apostrofu

\\ - lewy ukośnik (ang. backslash)

Aby wyświetlić tekst w 3 liniach wykorzystujemy sekwencję \n:

System.out.println(„To\njest teskt\nw 3 liniach”);

(130)

boolean hasNext() - zwraca wartość True jeśli następna wartość dowolnego typu jest dostępny do odczytu.

string next() - zwraca odczytaną następną wartość dowolnego typu.

boolean hasNextInt() - zwraca wartość True jeśli następna wartość jest typu Integer.

int nextInt() - zwraca następną odczytaną wartość typu int.

boolean hasNextDouble() - zwraca wartość True jeśli następna wartość jest typu Double.

double nextDouble() - zwraca następną odczytaną wartość typu Double.

(131)

Ryzykowne operacje zawiera się w blokach

„try”

Gdy coś złego się stanie – program wygeneruje wyjątek

Ów wyjątek jest łapany (stąd „catch”) i może zostać „obsłużony”

Dzięki temu program rzadziej się wysypuje

Blok „finally” wykona się zawsze, niezależnie od błędów

Literatura: http://www.javaworld.com/jw-07- 1998/jw-07-exceptions.html

(132)
(133)
(134)

1. Pamiętaj, że buforowane wyjście należy czyścić, a pliki – zamykać!

2. Klasa PrintWriter , jak również wszystkie inne poznane, mają wiele użytecznych metod, warto je poznać.

3. Za pomocą klasy File możesz zmieniać strukturę katalogów: tworzyć, kasować, odczytywać.

4. FileReader może bezpośrednio odczytywać plik, ale robi to bardzo wolno.

5. Parsowanie pliku tekstowego jest zadaniem wymagającym wiedzy o tym jak on jest

zbudowany.

(135)

Obiekt A

Obiekt B

Obiekt C

Obiekt D

(136)
(137)
(138)

Załóżmy, że mamy napisać program o następującej specyfikacji:

1. Program wyświetla kwadrat, okrąg i trójkąt.

2. Gdy użytkownik kliknie na jakiś kształt – tenże zaczyna świecić na niebiesko.

3. Jednocześnie – odgrywana jest muzyczka w .mp3, specyficzna do każdego z kształtów.

(139)
(140)

Proceduralnie Obiektowo

Kwadrat

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk*/

}

Trójkąt

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk*/

}

Okrąg

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk*/

}

(141)

Dodajemy nowy kształt:

Dodamy nowy kształt, ale tenże

będzie odgrywał muzyczkę .wav

(142)

Proceduralnie Obiektowo

Kwadrat

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Trójkąt

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

Okrąg } zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Dziwnokształtny

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj plik .wav*/

}

• Zmieniamy przetestowany już kod i być może coś się zepsuje

(143)

Kształt ma mieć inny kolor po kliknięciu:

A do tego kolor ten ma być

zmienny, podawany w parametrze i do tego gradientowy

(144)
(145)

Proceduralnie Obiektowo

Kwadrat

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Trójkąt

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

Okrąg } zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Dziwnokształtny

kolor1;

kolor2;

zmieńKolor() {

// tu będzie kod do zmiany koloru z gradientem

}

odtwórzDźwięk() { /* odegraj plik .wav*/

}

• Zmieniamy przetestowany kod

• Kolejne if-y…

(146)

Kwadrat

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Trójkąt

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Okrąg

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk mp3*/

}

Dziwnokształtny

kolor1;

kolor2;

zmieńKolor() {

// tu będzie kod do zmiany koloru z gradientem

}

odtwórzDźwięk() { /* odegraj plik .wav*/

}

(147)

Kwadrat Okrąg Trójkąt Dziwnokształtny

Kształt

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk*/

}

(148)

Kwadrat Okrąg Trójkąt Dziwnokształtny

kolor1;

kolor2;

zmieńKolor() {

// tu będzie kod do zmiany koloru z gradientem

}

odtwórzDźwięk() { /* odegraj plik .wav*/

}

Kształt

zmieńKolor() {

// tu będzie kod do zmiany koloru

}

odtwórzDźwięk() { /* odegraj dźwięk*/

}

(149)

Klasa będzie swoistym

„projektem” obiektów tworzonych na jej

podstawie.

To co obiekt wie = atrybuty

To co obiekt potrafi = metody

Nazwa klasy To co obiekt wie…

To co obiekt potrafi…

(150)

Pies

To co obiekt wie…

To co obiekt potrafi…

Telewizor

To co obiekt wie…

To co obiekt potrafi…

(151)
(152)
(153)
(154)

Programowanie zorientowane obiektowo pozwala na dodawanie funkcjonalności bez zmiany uprzednio przetestowanego kodu.

Wszystko w Javie jest obiektem (znajduje się wewnątrz klasy)

Klasa opisuje sposób na stworzenie obiektu danego typu. Taki schemat.

Obiekt potrafi robić różne rzeczy. Niekoniecznie interesuje nas w jaki sposób to robi.

Obiekt wie o niektórych rzeczach i robi specyficzne rzeczy

Rzeczy które obiekt wie o sobie nazywane atrybutami.

Reprezentują stan obiektu.

Rzeczy które obiekt robi nazywane są metodami. Reprezentują zachowanie obiektu.

Gdy tworzysz klasę, zwykle powinieneś też stworzyć oddzielną klasę do testowania w której stworzysz obiekty poprzedniej klasy.

Klasa może dziedziczyć atrybuty i metody z superklas (bardziej ogólnych klas)

Programy w Javie to po prostu gadanie obiektów do siebie 

(155)

Cytaty

Powiązane dokumenty

(główne twierdzenie klasyfikacyjne) 15 Każda skończona grupa prosta jest izomorficzna z jedną z grup z serii (C1) – (C18) lub z jedną ze sporadycznych grup prostych (S1) –

 diss logical flag: if TRUE (default for dist or dissimilarity objects), then x is assumed to be a dissimilarity matrix.. If FALSE, then x is treated as a matrix of observations by

 x data matrix or data frame, or dissimilarity matrix, depending on the value of the diss argument..  diss logical flag: if TRUE (default for dist or dissimilarity objects), then

• Dana jest obserwacja C z przypisanym wektorem zmiennych objaśniających dla której chcemy prognozowad wartośd zmiennej objaśnianej

 Zmienne reprezentowane przez węzły przyjmują wartości dyskretne (np.: TAK, NIE)..  Siecią Bayesa nazywamy skierowany graf acykliczny o wierzchołkach

 diss logical flag: if TRUE (default for dist or dissimilarity objects), then x is assumed to be a dissimilarity matrix.. If FALSE, then x is treated as a matrix of observations by

 Preprocessing danych: czyszczenie danych, transformacja danych, selekcja atrybutów, dyskretyzacja atrybutów liczbowych..  Zalety: ułatwia analizę dużych zbiorów

Wartość wyrażenia arytmetycznego musi być możliwa do obliczenia podczas kompilacji.. Komentarze są ciągami znaków ignorowanymi podczas