background image

Języki Programowania 

 

 

Klasy i obiekty w języku Java 

 

Obiekty i klasy 

 Obiekty 

Obiekty są małymi programami (lub fragmentami programów) 

Obiekty współpracują ze sobą w celu wykonania określonego 
zadania 

Obiekty zawierają dane (pola – 

fields

Obiekty zawierają procedury przetwarzania danych, czyli 
metody (

methods

 

 

 Klasy 

Klasy są „fabrykami” obiektów 

Każda klasa produkuje ściśle określony rodzaj (typ) obiektów 

Każdy obiekt należy do jednej, określonej klasy 

 Klasa obejmuje obiekty tego samego rodzaju, utworzone 

według tego samego pierwowzoru klasy 

Klasa jest wzorcem budowy obiektów 

 

 

background image

Obiekty i klasy 

Każda klasa może być opisana 
przez podanie 

 

 konstruktora 

zbiór metod zdefiniowanych 

wewnątrz klasy 
 

 Konstruktor tworzy nowy obiekt 

danej klasy 

Metody powodują wykonanie 

określonej czynności 

Malarz 

Konstruktor: 

       Malarz() 
 

Metody: 

 

void rysujDom() 

 

void rysujPortret(string) 

 

void kasujPiksel() 

 

void zmienKolor() 

 

Konto bankowe jako obiekt 

Tworzymy obiekt, którego 
zadaniem jest modelowanie konta 
bankowego 

 Co to jest konto bankowe? 

ma swój numer 

zawiera nazwisko właściciela 

zawiera informację o stanie 
środków na koncie 

Jakie operacje (metody) można 
określić dla konta bankowego? 

 podaj stan konta 

dokonaj wypłaty z konta 

dokonaj wpłatę na konto 

 dokonaj przelewu na inne konto 

bankowe 

background image

Konto bankowe jako klasa 

Klasa 

Konto

 zawiera trzy pola (

fields

określające numer konta, właściciela i 
stan konta 

Każdy obiekt utworzony przez tę klasę 
ma swoje własne pola odpowiadające 
polom klasy, w których obiekty 
przechowują swoje wartości pól 

Przykłady trzech obiektów klasy 

Konto

class

 Konto 


  

int

 numer; 

  String

 wlasciciel; 

  

int

 stanKonta; 

Ćwiczenie:

 

zdefiniuj klasę 

Konto

 

w BlueJ i utwórz trzy obiekty tej klasy o nazwach:

 

konto1

konto2

 i 

moje_konto

. Wykonaj inspekcję obiektu 

moje_konto

 

i sprawdź, że: 

int numer = 0

String wlasciciel = <null>

 , 

int stanKonta = 0 

Typy pól w języku Java 

int

 jest typem 

prymitywnym

 (primitive type

) języka Java 

wartości zmiennych (pól) typu prymitywnego są pamiętane bezpośrednio w 
obszarze pola 

inne typy prymitywne języka Java: 

boolean 

char 

byte 

short 

long 

float 

double 

String

 

jest typem obiektu, a więc klasą języka Java, tak samo jak 

wcześniej zdefiniowane klasy Malarz czy Konto 

W polu typu obiektowego nie przechowuje się wartości, ale link (referencję, czyli 
adres) do miejsca w pamięci, gdzie ta wartość się znajduje 

Pola typu obiektowego przed inicjalizacją zawierają 

<null> 

background image

Odwołanie przez adres 

Zmienne typów 

prymitywnych

 

zawierają wprost podaną 

wartość 

zmiennej, natomiast 

obiekty 

zawierają 

adres 

miejsca pamięci, gdzie 

ulokowane są pola danych obiektu (

!!!

Nazwa obiektu jest zatem tylko adresem (wskaźnikiem) położenia 
obiektu. Do obiektów odwołujemy się więc przez adres (

reference

), a 

do zmiennych typów prymitywnych przez wartość (

value

Jeśli 

num1

 

jest zmienną typu 

int

, a 

name1

 obiektem klasy 

String

to wówczas możemy narysować diagram: 

“Imie Nazwisko” 

name1 

num1  52 

Przypisanie = 

Operacja przypisania 

kopiuje

 

wartość podaną z prawej 

strony przypisania do miejsca wskazanego z lewej 
strony 

Dla typów prymitywnych 

num1  38 

num2  96 

przed 

num2 = num1; 

num1  38 

num2  38 

po 

background image

Przypisanie dla obiektów 

Jeśli 

name1

 i 

name2

 

są nazwami obiektów (np. klasy 

String

), to przypisanie dotyczy 

adresów

, a nie wartości 

(

!!!

name2 = name1; 

name1 

name2 

przed

„Kamil Wozniak" 

„Piotr Wozniak" 

name1 

name2 

po

„Kamil Wozniak" 

10 

Aliasy (aliases

Dwie lub więcej referencji do tego samego obiektu są 
nazywane 

aliasami

  

Oznacza to, że ten sam obiekt może być wskazany 
przez wiele nazw 

Aliasy mogą być użyteczne, ale należy je stosować z 
dużą ostrożnością, bo często prowadzi to do błędów w 
programach 

Pamiętaj:

 

zmiana obiektu przez jedną z referencji 

zmienia obiekt dla wszystkich referencji, ponieważ w 
pamięci jest to realnie jeden i ten sam obiekt 

background image

11 

Zwalnianie pamięci 

(

garbage collection

Jeśli obiekt nie ma żadnej ważnej referencji oznacza to, 
że jest niewykorzystywany (program nie może mieć do 
niego dostępu) 

Taki obiekt jest bezużyteczny i nosi nazwę 

garbage 

Java wykonuje automatyczną inspekcję obiektów i 
wykrywa obiekty bezużyteczne, po czym likwiduje je w 
pamięci automatycznie zwracając pamięć do innych 
potrzeb. Proces ten nosi nazwę 

garbage

 

collection 

W innych językach programista sam odpowiada za 
zwalnianie pamięci po bezużytecznych obiektach 

12 

Metody 

We wcześniejszym przykładzie klasy i obiektów 
dotyczących kont bankowych zdefiniowaliśmy 
na razie pola 

Pozostaje zdefiniować jeszcze metody 

podajStanKonta  

(observer zwracany typ int) 

wplata            

(mutator 

– void) 

wyplata           

(mutator 

– void) 

przelew           

(mutator 

– void) 

Metody dzielą się na dwa rodzaje: 

observer

 

– metody, które zwracają wartość                                                    

wyprodukowaną przez obiekt. Wartość może być                                               
typu int, String itp. Metody tego typu nie zmieniają stanu obiektu 

mutator

 

– metody, które zmieniają stan obiektu, nie dostarczają informacji o 

obiekcie 

W wyjątkowych sytuacjach metoda może być jednocześnie observerem i 
mutatorem (należy tego jednak unikać) 

 Inne terminy: observer - 

getter

, mutator - 

setter 

 

background image

13 

Metody zwracające wynik 

Metoda 

podajStanKonta

 zwraca wynik typu 

int

 

będący 

wartością pola 

stanKonta 

 

 

 
 

 

int

  

podajStanKonta

( ) 


 

 

return

 stanKonta; 

 

Typ zwracanego 

wyniku 

Nazwa metody 

Lista parametrów 

(tutaj pusta) 

Zwróć jako wynik 

(rezultat) ... 

Wartość pola 

stanKonta 

14 

Metody z parametrem 

Metoda 

wplata

 wymaga podania argumentu (parametru) typu 

int

 

będącego wartością kwoty wpłaty

 

 

 

 
 

 

void

  

wplata

(int kwota) 


 

 

stanKonta

 

+=

 kwota; 

 

Typ zwracanego 

wyniku (brak) 

Nazwa metody 

Parametr typu 

int 

Stan konta 

zwiększ o ...

 

kwotę

 

background image

15 

Sygnatura metody 

Nagłówek metody nazywany jest również 

sygnaturą

. Dla sygnatury 

istotny jest tylko typ zwracanej wartości i typy parametrów

 

 

 

 
 

 

void

  

wplata

(int kwota) 


 

 

stanKonta

 

+=

 kwota; 

}

 

int

  

podajStanKonta

( ) 


 

 

return

 stanKonta; 

}

 

void

  

przelew

(Konto odbiorca, int kwota) 


 

 

//

 ... Zajmiemy sie tym później

}

 

void (int) 

int ( ) 

void (Konto, int) 

16 

Klasa 

Konto 

Należy zwrócić uwagę na sposób 
formatowania nawiasów 
klamrowych w ciele metody 

Istnieje wiele konwencji, ale ta jest 
powszechna i wygodna 

Jeśli kursor znajdzie się za klamrą 
edytor pokazuje w szarej obwódce 
jej partnera co ułatwia sprawdzanie 
poprawności struktury nawiasów 
 

background image

17 

Uruchamiamy metodę 

Kompilujemy klasę 

Konto

 i konstruuje-

my obiekt tej klasy nadając mu nazwę 
np. 

konto1

 

Wywołujemy metodę 

wplata 

Pojawia się okno, w którym należy 
podać wartość parametru metody 
(kwotę wpłaty) 
Następnie możemy uruchomić metodę 

podajStanKonta

, aby sprawdzić, czy 

wpłata została dokonana 

 

Ćwiczenie:

 

uzupełnij klasę 

Konto

 o 

metodę 

wyplata

 (podobna do 

wplata

ale zamiast 

+=

 

należy użyć operacji 

-=

)

 

Włącz inspektora obiektu i dokonuj 
wpłat oraz wypłat obserwując „na żywo” 
stan konta. 

18 

Przelewy 

void

  

przelew

(

Konto

 odbiorca, 

int

 kwota) 


 

wyplata(kwota); 

 

odbiorca.wplata(kwota); 

}

 

Aby dokonać przelewu metoda 

przelew

 

musi otrzymać dwa parametry: 

•  konto odbiorcy 
•  kwotę przelewu 

Podczas 

wywołania

 metody 

parametry formalne

 

metody otrzymują wartości 

parametrów aktualnych 

przelew

(

konto7

,325) 

wyplata

(325); 

konto7

.wplata(325); 

Wywołanie: 
 
Powoduje wywołanie 
metody innego 
obiektu 

Obiekty komunikują się ze sobą. W tym przykładzie obiekt 

konto7

 

otrzymuje komunikat aby wywołać metodę 

wplata

 z parametrem 

o wartości 

325. 

Sprawdź jak to działa w BlueJ 

background image

10 

19 

Konstruktor 

Konstruktor służy do generowania nowych obiektów danej klasy 

Dotąd wszystkie nowe obiekty klasy 

Konto

 

były tworzone w taki 

sposób, że 

numer = 0 

wlasciciel = <null> 

Za metodę Konstruktor odpowiada klasa 

Konstruktor obiektów danej klasy (np. 

Konto

) ma taką samą 

nazwę (czyli 

Konto

). Należy pamiętać o rozróżnieniu małych i 

dużych liter 

Konstruktor nie zwraca żadnej wartości; wynikiem jego działania 
jest nowy obiekt danej klasy. Konstruktor nie zawiera zatem 
słowa return 

Dla każdej klasy istnieje domyślny konstruktor, który inicjalizuje 
pola tworzonego obiektu tak, że pola typu 

int

 

otrzymują 

wartość 

0

, natomiast pola typu obiektowego (np. 

String

wartość 

<null> 

 

Domyślny konstruktor 
klasy 

Konto 

Konto( ) 

 

20 

Ulepszony konstruktor 

Konto

(

int

 nowyNumer, 

String

 nazwisko){ 

 

numer

 = nowyNumer; 

 

wlasciciel

 = nazwisko; 

 

stanKonta

 = 0;

 

}

 

new

 Konto

(

569123666

,

 

”Kowalski”

Definicja konstruktora 

Wywołanie konstruktora 

Efekt 
 
Nowy obiekt ma 
numer i właściciela 
zgodnie z 
parametrami 
aktualnymi wywołania 
konstruktora 

background image

11 

21 

Więcej konstruktorów 

Klasa może mieć większą liczbę konstruktorów 

Przykłady 

Bank oferuje nowym klientom początkową kwotę (saldo) na koncie w prezencie (znany 
chwyt) 

Jeśli klient banku zwerbuje nowego klienta otrzymuje premię 

Konstruktory wewnątrz klasy 

muszą mieć

 

różne typy listy parametrów, czyli 

różne sygnatury 

Wewnątrz klasy Konto możliwe są na przykład konstruktory 

Konto()   

 

 

 

 

Konto() 

Konto(int numer, String nazwisko) 

 

 

Konto(int,String) 

Konto(String nazwisko, int numer) 

 

 

Konto(String,int) 

Konto(int numer, String nazwisko, int prezent) 

 

Konto(int,String,int) 

Konto(int numer, String nazwisko, Konto werbujacy) 

 

Konto(int,String,Konto) 

Nie są natomiast dozwolone jednocześnie konstruktory 

Konto(int numer, String nazwisko) 

 

 

Konto(int,String) 

Konto(int kwota, String odbiorca) 

 

 

Konto(int,String) 

Należy pamiętać, że nie wszystko co dozwolone ma sens 
 

sygnatury 

22 

Ochrona danych 

Konto 

Pole: 
 

int

 numer 

 

String

 wlasciciel 

 

int

 stanKonta 

Konstruktor: 

       Konto() 
 

Konto(

int,String

 

Metoda: 

 

int 

podajStanKonta() 

 

void

 wplata(

int

 

void 

wyplata(

int

 

void 

przelew(

Konto,int

 

.... 

 

Użytkownik klasy 

Konto

 

powinien mieć 

dostęp do danych obiektu tej klasy tylko 
przez metody 
 
Można ochronić wybrane pola przed 
dostępem z zewnątrz za pomocą słowa 
kluczowego 
 

private 

 

 
 

background image

12 

23 

Ochrona danych 

cd. 

Chronimy pola 

wlasciciel

 i 

stanKonta 

Użytkownik obiektu nie może 
odczytać lub zmienić tych pól 
inaczej jak tylko przez dostępne 
metody 

 

int podajStanKonta() 

 

String podajWlasciciela() 

 

wplata() 

 

wyplata() 

 

przelew() 

 

zauważmy, że można odczytać 

pole 

wlasciciel

, ale nie można go 

zmienić

 

Jeśli bank chce później np.: 

 

wprowadzić opłaty od operacji 

 

drukować protokoły i wyciągi 

Musi zmodyfikować potrzebne 
metody i ma pewność 
bezpieczeństwa transakcji 

// pola obiektu 
   

int

 numer; 

   

private

 String wlasciciel; 

   

private

 

int

 stanKonta; 

 
// metody obiektu 
   

public

 

int

 podajStanKonta(){ 

       return

 stanKonta; 

   } 
 

   public

 String podajWlasciciela(){ 

      return

 wlasciciel; 

   } 
 

   public

 void

 wplata(

int

 kwota){ 

      stanKonta += kwota; 
   } 
 

dostępne z 

zewnątrz obiektu 

24 

getters & setters 

Projektując klasę zaleca się 
deklarować wszystkie dane w 
polach 

private

 

Dostęp do danych z zewnątrz 
powinien odbywać się tylko przez 
metody 

public 

Przejrzystość zapewnia podział 
metod na dwie grupy: 

 

setter 

– do ustawiania wartości pól 

getter

 

– do odczytu wartości pól 

zaleca się by nazwy metod 
zaczynały się odpowiednio od 

get

 

lub 

set

 

(wcześniej tego nie 

przestrzegaliśmy pisząc np. 
podajStanKonta) 

Date 

Fields: 

 

private int

 day 

 

private int 

month 

 

private int 

year 

Constructors: 

       Date() 
 

Date(

int,int,int

Methods: 
   

getter 

 

public int 

getDay() 

 

public int 

getMonth() 

 

public int 

getYear() 

   

setter 

      

public void

 setDay() 

 

public void

 setMonth() 

 

public void

 setYear() 

 
 

background image

13 

25 

Pola statyczne 

pola klasy są 
oznaczone słowem 
kluczowym 

static 

 

pola klasy i obiektu 
będą wstępnie 
inicjowane 

class

 Konto{ 

// pola klasy 

    

static

 

int

 stopaProcentowa = 4; 

    

static

 

int

 licznikKont; 

 

// pola obiektu 

    int

 numer; 

    String wlasciciel = 

”Pan Dyrektor”; 

    

int

 stanKonta = 0; 

Dotąd opis klasy zawierał jedynie pola, które były zawsze powielane dla 
każdego tworzonego obiektu tej klasy. Obiekty dysponowały własnymi 
egzemplarzami takich pól. 
Niekiedy chcemy, by pole było związane z klasą, a nie z obiektem, to znaczy by 
miało jedną wspólną wartość (i jeden egzemplarz w obrębie klasy). Takie pola 
deklaruje się jako statyczne słowem kluczowym 

static 

 

26 

Autoinkrementacja x++ 

class

 Konto{ 

// pola klasy 

    

static

 

int

 stopaProcentowa = 4; 

    

static

 

int

 licznikKont; 

// konstruktor 

    Konto(String nowyKlient){ 
       wlasciciel = nowyKlient; 
 

stanKonta = 0; 

 

numer = licznikKont; 

 

licznikKont++; 

    } 

// pola obiektu 

    int

 numer; 

    String wlasciciel; 
    

int

 stanKonta; 

// metody obiektu 
   ... 

Każde pole 

xyz

 typu 

int

 

może 

być autoinkrementowane 
 

xyz++ ; 

co powoduje zwiększenie 
wartości pola o 1 
 
 
 
 
Zwiększ aktualny numer konta 
(który będzie przydzielony 
następnemu klientowi) o 1 

background image

14 

27 

Metody statyczne 

Podobnie jak pola statyczne, można w obrębie klasy definiować statyczne 
metody

. Są one używane do: 

 manipulacji na polach statycznych 

np. do zmiany obowiązującej w banku stopy procentowej 

implementacji obserwatorów (observers) niezależnych od wywoływanego 
obiektu 

np.  

getStopaProcentowa() 

zapisu konstruktorów – w tym przypadku słowo 

static

 

pomija się (tak 

robiliśmy wcześniej), ponieważ konstruktor nie zwraca wyniku, tylko 
tworzy nowy obiekt 

class

 Konto{ 

   

static

 stopaProcentowa = 3; 

 
   

static

 

int

 

getStopaProcentowa()

      return stopaProcentowa(); 
   } 

28 

Wywoływanie metod 

Jeśli chcemy wywołać metodę obiektu, musimy najpierw utworzyć obiekt 

określonej klasy, a następnie wywołać metodę: 

 
 

 
 

obiekty 

 

slonce 

 

sciana 

 

 
 

Jeśli chcemy wywołać metodę klasy (metodę 

statyczną

), przy wywołaniu 

zamiast nazwy obiektu podajemy nazwę klasy 

 

 
 
 
 
 
 

klasa

 Konto 

Square sciana = new Square(); 
Circle slonce = new Circle() 
... 
slonce.changeColor(

”yellow”); 

sciana.moveHorizontal(50); 

Konto

.getStopaProcentowa(); 

background image

15 

29 

Komentarze 

Java stosuje trzy rodzaje komentarzy programu źródłowego 

//

 

komentarz do końca linii 

// krótkie wyjaśnienie znaczenia operacji, metody itp.. 

/*

 tekst zawarty w tych ogranicznikach 

*/ 

podkreśla najtrudniejsze fragmenty kodu 

ułatwia późniejsze ich zrozumienie 

ułatwia czytanie kodu przez innych 

/**

 z teksu zawartego w tych klamrach 

*/ 

aplikacja 

javadoc.exe

 wydobywa automatycznie dane na temat aplikacji 

stosuje się specjalne znaczniki dla określonych danych: 

@author 

@date 

@param 

@return .... 

na tej podstawie tworzy się automatycznie dokumentację oprogramowania 

generowanie dokumentacji w 

BlueJ

: menu 

Tools

 opcja 

Project 

Documentation

, dokumentację można obejrzeć w przeglądarce HTML 

30 

Używanie predefiniowanych klas 

Klasa 

Malarz

 

używała zdefiniowanych wcześniej (w częściowo 

gotowym projekcie 

BlueJ

 o nazwie 

shapes

) klas 

Circle

Square

 i 

Triangle 

Z kolei klasy te używają klasy 

Canvas

, która definiuje obszar rysowania 

na ekranie 

Z predefiniowanych klas można korzystać, nawet nie znając 
szczegółów ich budowy,                                                                          
jeśli znamy tylko informacje                                                                    
na temat sygnatury klasy                                                                               
i jej metod udostępnianych                                                                    
na zewnątrz 

 BlueJ

 podaje relacje wzajem-                                                              

nego korzystania z klas                                                                            
przez inne klasy w postaci                                                              
graficznej 

background image

16 

31 

Wbudowane klasy 

Aby ułatwić tworzenie programów Java dostarcza programiście wiele predefiniowanych 
klas zebranych w bibliotekach klas dołączanych do środowiska JDK 

Niektóre z predefiniowanych klas są wbudowane w język Java, inne zaś wymagają 
dołączania bibliotek nazywanych pakietami (

packages

System 

Klasa wbudowana, służy do operacji związanych z systemem komputerowym 

Szczególnie przydatne jest statyczne pole 

out 

Zawiera ono obiekt umożliwiający wyprowadzanie danych (tzw. „

PrintStream

”) 

PrintStreams

 

udostępniają metodę 

println()

 

, do wyprowadzania danych (wyświetlania) w oknie 

terminala 

System.out.println(”Hej ludzie, co się dzieje”); 
System.out.println(17+4); 
System.out.println(mojeKonto);  

//co to spowoduje – sprawdź! 

 

Można też skorzystać z pakietu 

java.io

 

i zlecać wyprowadzanie danych jak podano 

poniżej 
 
PrintStream wydruk = System.out; 
Wydruk.println(”komunikat numer 25”); 
Wydruk.println(”17 + 4 = ” + (17+4));  

//co się wydrukuje? 

32 

Wbudowana klasa 

Math 

Math 

 Klasa ze zbiorem 

funkcji matematycznych 

 np. 

max

min

abs

random

sin

log

, 

… 

i stałych matematycznych 

PI

klasa 

Math

 

ma wyłącznie 

statyczne

 pola i metody 

nie trzeba samemu tworzyć obiektów do realizacji operacji 
matematycznych 
 

System.out.println(

Math.max(3,5)

); 

System.out.println(

Math.abs(x*x-10*x+1)

); 

 
System.out.println(

Math.sqrt(Math.PI + Math.E)

); 

System.out.println(

Math.random()

); 

background image

17 

33 

Klasa 

String 

String 

Obiekty są ciągami (łańcuchami) znaków (ściślej – 

listą znaków) 

Stringi można 

Sklejać ze sobą (konkatenować) 

Wyprowadzać na ekran 

np. z pomocą 

System.out.println(); 

Dostępne są metody do 

Określania długości stringu: 

length( ) 

”Hello”.length() 

Porównywania dwóch stringów: 

equals( ) 

”Hello”.equals(”Hello”) 

Wydzielenia i-tego znaku: 

charAt( ) 

 

… 

 

 

34 

Klasa 

String 

(cd.) 

tworzenie stringów 

przez podanie treści ujętej w cudzysłowy 

”Hello World”

,

 ”Sincerely yours \n James Bond” 

w programie, z użyciem konstruktora 

String pozdro = new String(”Hi guys”); 

lub bezpośrednio 

String pozdro = ”Hi guys”; 

operator konkatenacji „

+

” 

”Hello” + ” world”

 

daje ”

Hello world” 

”bez” + ”spacji”

 daje 

”bezspacji” 

wszystkie typy języka Java mają swoją reprezentację jako stringi: 

konwersja odbywa się automatycznie od lewej do prawej 

System.out.println(”1 plus 1 daje ”+(1+1));  

// 1 plus 1 daje 2 

System.out.println(”1 plus 1 daje ”+1+1);    

// 1 plus 1 daje 11 

można dokonać konwersji każdego obiektu na string 

toString() 

background image

18 

35 

Klasa 

String 

(cd.) 

36 

Aplikacje Java 

Aplikacja w języku Java jest kompletnym, samodzielnym programem (

stand-alone

Aplikacja składa się z co najmniej jednej głównej klasy 

public

 (w podanym 

przykładzie 

MojaAplikacja

) i ewentualnie ze współpracujących z nią klas 

pomocniczych (w tym przykładzie taką klasą jest 

AlgorytmAplikacji

public 

class

 MojaAplikacja 


    public static 

void

 main(String[] args){ 

        AlgorytmAplikacji.zrobSwoje(); 
        System.out.println("Podane argumenty"); 
        for (

int 

k=0; k<args.length; k++) 

            System.out.print(args[k]+" "); 
    } 

 
 
public 

class

 AlgorytmAplikacji 


    public static 

void

 zrobSwoje(){ 

        System.out.println("Pozdrowienia od algorytmu"); 
    } 
    

// zapis właściwej treści algorytmu aplikacji 

Główna klasa aplikacji musi 
zawierać metodę 

main

 o 

sygnaturze podanej w 
przykładzie 
 

args

 

oznacza tablicę 

stringów, do której trafią 
argumenty aplikacji podane 
przy jej uruchomieniu 

background image

19 

37 

Aplikacje w JDK 

Tworzenie i uruchamianie aplikacji w środowisku 

JDK

 przebiega w 

następujących etapach: 

Utworzenie kodów źródłowych klas i zapisanie ich w plikach z 
rozszerzeniem .

java

, w tym przykładzie 

MojaAplikacja.java 

AlgorytmAplikacji.java 

 Skompilowanie klas kompilatorem 

javac 

javac MojaAplikacja.java 

javac AlgorytmAplikacji.java 

Na dysku pojawiają się pliki 

bytecode

MojaAplikacja.class 

AlgorytmAplikacji.class 

 Uruchomienie aplikacji: 

java MojaAplikacja lista_parametrów 

Lista parametrów 

P1, P2, P3 ...

 

jest opcjonalna, stosujemy ją jeśli chcemy 

wprowadzić z linii poleceń argumenty do uruchamianej aplikacji. W podanym 
dalej przykładzie zastosowano 4 argumenty typu String: 

java MojaAplikacja jeden 2 trzy 4 

 

38 

Uruchomienie aplikacji w JDK 

Uwaga:

 

należy sprawdzić, czy jest zdefiniowana ścieżka dostępu do katalogu 

zawierającego kompilator 

javac

 i JVM 

java 

służy do tego polecenie 

PATH

 systemu operacyjnego 

w podanym przykładzie, aby nie komplikować sprawy umieszczono pliki aplikacji 
w tym samym katalogu co kompilator i JVM 

 

Jako parametry podano cztery wartości: 

jeden 2 trzy 4 

zgodnie z sygnaturą metody 

main

 

wszystkie parametry są traktowane jako 

stringi, zatem np. 2 oznacza jednoznakowy string ”2”, a nie liczbę całkowitą 2 !!! 

background image

20 

39 

Aplikacja w BlueJ 

Wykonać edycję klas 

MojaAplikacja

 

AlgorytmAplikacji 

W oknie graficznych zależności miedzy 
klasami dodać przerywaną strzałkę 
wskazującą, że klasa 

MojaAplikacja

 

korzysta z klasy 

AlgorytmAplikacji 

Skompilować klasy i przetestować 
metodę 

main 

Wybrać opcję 

Project/Create Jar File 

W rozwijanym menu wybrać jako klasę 
główną 

MojaAplikacja 

Zapisać aplikację jako wykonywalny 
plik, np. o nazwie 

aplikacja_testowa 

 BlueJ

 utworzy w podanym katalogu 

tzw. wykonywalny plik 

jar

który 

można wykonać w JDK jak poprzednio

 

40 

Aplikacje spakowane 

.jar 

Wyprodukowana w ten sposób aplikacja została zapisana przez 

BlueJ 

tzw. formacie spakowanym 

.jar

 (

java archive

Powstał plik 

aplikacja_testowa.jar 

 Aplikacje 

jar

 

można uruchomić w JDK korzystając z opcji 

java 

–jar

 jak 

pokazuje poniższy obraz konsoli poleceń DOS 

 Pliki 

.jar

 

można też rozpakować programem WinZip i uruchamiać w zwykły 

sposób, bez korzystania z opcji 

-jar 

 W plikach 

.jar

 

oprócz kodu skompilowanych klas można również zawrzeć dla 

celów dokumentacyjnych inne elementy, np. kody źródłowe. W tym celu podczas 
tworzenia plików 

.jar

 

należy zaznaczyć odpowiednie opcje w oknie 

BlueJ 

 Pliki 

.jar

 

można również tworzyć w SDK firmy Sun Microsystems 

background image

21 

41 

Dziedziczenie - interitance 

W języku Java można tworzyć klasy potomne – 

podklasy

 

dziedziczące cechy klasy podstawowej – 

nadklasy 

Załóżmy, że chcemy utworzyć specjalne rodzaje kont bankowych 

 Konta debetowe 

można się na nich zapożyczyć ponad saldo konta, ale trzeba płacić odsetki 

konto jest nieoprocentowane 

Konta oszczędnościowe 

konto jest oprocentowane 

nie można się zadłużać 

nie można podejmować wypłat 

 Tworzymy konta 

DebetKonto 

LokataKonto 

 

które są podklasami zdefiniowanej wcześniej klasy 

Konto 

 

42 

Klasa 

Konto 

background image

22 

43 

Dziedziczenie 

cd. 

Podklasy i ich obiekty mają swoiste właściwości 

Dziedziczą

 

pola i metody nadklasy, które 

nie są prywatne 

A więc automatycznie konta debetowe i lokacyjne mają 

 pola: 

numer, stanKonta, wlasciciel 

 metody: 

podajStanKonta, wplata, wyplata 

Mogą mieć dodatkowe pola: 

Konta lokacyjne mogą mieć nowe pola 

 oprocentowanie 

stopaProcLokaty 

 kiedy ostatnio naliczono odsetki (od kiedy trwa okres odsetkowy) 

Konta debetowe mogą mieć dodatkowe pola 

wysokość odsetek za zadłużenie 

limit zadłużenia 

od kiedy powstało zadłużenie 

Mogą mieć dodatkowe metody: 

Konta lokacyjne 

 naliczone odsetki 

Konta debetowe 

 naliczone karne odsetki 

44 

Podklasy 

Przy pomocy słowa kluczowego 

extends

 klasa dziedziczy cechy 

innej klasy: 

class

 

LokataKonto

 

extends

 Konto{ 

   ... 

  static

 int stopaProcLokaty = 3; 

  

int

 ostatniDzienNaliczOdsetek; 

 
  

int

 

getStopaProcLokaty

(){ 

     return

 stopaProcLokaty; 

  } 
 
  void 

naliczOdsetki

(){ 

    ... 

class

 

DebetKonto

 

extends

 Konto{ 

   ... 

  static

 int stopaProcKredytu = 13; 

  

int

 ostatniDzienOkresuRach; 

  

int

 limit=10000; 

 
  

int

 

getLimit

(){ 

     return

 limit; 

  } 
 
  void 

naliczKosztKredytu

(){ 

    ... 

background image

23 

45 

super 

Odwołanie z podklasy do nadklasy 

 podklasa nie dziedziczy konstruktora z nadklasy 

na samym początku podklasy trzeba zbudować konstruktora 

często robi się to przez wykorzystanie konstruktora nadklasy, z 
wykorzystaniem odwołania 

super

, jak pokazuje poniższy przykład 

odwołanie 

super

 

może być stosowane również w celu dostępu do 

innych elementów nadklasy 

class

 

LokataKonto

 

extends

 Konto{ 

  // przejmujemy konstruktora 
  // z nadklasy 

  LokataKonto(String x){ 
      

super

(x); 

      ostatniDzienNaliczOdsetek = 0; 
  } 
      ... 

46 

Dostęp do nadklasy 

pola 

private

 

są chronione 

niedostępne również z podklas 

muszą wystarczyć metody 

getter

 

setter 

 

pola 

protected 

dostępne z podklasy 

niedostępne z innych klas 

 

niechronione pola 

dostępne ze wszystkich klas 
całego pakietu 

niedostępne z klas innych 
pakietów 

są prywatne dla pakietu 

Konto 

Pole: 

  

static 

protected

 

int 

stopaProc 

  

protected

 

int

 stanKonta 

  

String

 wlasciciel 

  

private int

 numer 

Metoda: 
  getter 

    public int 

getStanKonta() 

    

public int

 getWlasciciel() 

    

public int

 getNumer() 

    

public boolean

 czyRokPrzest() 

  

setter 

    

public void

 wplata(

int

    

public void

 przelew(Konto,

int

    

public void

 wyplata(

int

    ... 
 

background image

24 

47 

Dostęp z podklasy 

Konto 

Pole: 

  

static 

protected

 

int 

stopaProc 

  

protected

 

int

 stanKonta 

  

String

 wlasciciel 

  

private int

 numer 

Metoda: 
  getter 

    public int 

getStanKonta() 

    

public int

 getWlasciciel() 

    

public int

 getNumer() 

    

public boolean

 czyRokPrzest() 

  

setter 

    

public void

 wplata(

int

    

public void

 przelew(Konto,

int

    

public void

 wyplata(

int

    ... 
 

class

 

LokataKonto

 

extends

 Konto{ 

    

  

void

 naliczOdsetki

(){ 

    wplata(

stanKonta * stopaProc

); 

  }  //  

OK 

 
  void 

drukujWyciag

(){ 

    System.out.println(

wlasciciel

); 

//OK. 

    System.out.println(numer); 

// błąd! 

    System.out.println(stanKonta); 

//OK. 

  } 
... 

48 

this 

słowo kluczowe 

this

 oznacza aktualny obiekt 

 this(), this(...)

 

oznaczają konstruktory aktualnej klasy 

poniższy przykład ilustruje użycie this do budowy konstruktorów 

public

 Konto(){ 

   /* ten fragment kodu powinien znaleźć się również 
    * w innych ewentualnych konstruktorach klasy Konto 
   */ 

   numerKonta = licznikKont; 
   licznikKont++; 

public

 Konto(String nazwisko){ 

   

this

();  

// wołamy konstruktora bez parametrów 

   wlasciciel = nazwisko; 

public

 Konto(String nazwisko, 

int

 kwota){ 

   

this

(nazwisko);   

// wołamy konstruktora z parametrem 

   stanKonta = kwota; 

background image

25 

49 

Podklasy w BlueJ 

Strzałki z ciągłymi liniami wskazują, że 
klasy 

LokataKonto

 i 

DebetKonto

 

są 

podklasami klasy 

Konto 

Każdy obiekt podklasy: 

zawiera dodatkowe metody 

- dziedziczy wszystkie metody nadklasy 

50 

Overriding 

– przedefiniowanie 

Metody nadklasy mogą być 

przedefiniowane

 w podklasie, 

można jest zdefiniować z tą samą nazwą, ale z inną treścią; nowa 
definicja „przesłania” definicję z nadklasy, stąd nazwa 

overriding 

przykład: overriding metody 

wyplata 

 w podklasie 

LokataKonto

, które nie dopuszcza debetu, przed 

wypłatą należy sprawdzić, czy kwota wypłaty nie przekracza stanu 
konta 

class

 

LokataKonto

 

extends

 Konto{ 

   ... 
   

void

 

wyplata

(int kwota){ 

     

if

 (getStanKonta() >= kwota) 

        

super

.

wyplata

(kwota); 

   } 
   ... 

metoda 

wyplata

 nadklasy, czyli klasy 

Konto 

background image

26 

51 

Klasy 

– podklasy 

Kiedy modelować klasę jako podklasę istniejącej już klasy? 

Tylko wtedy, gdy ma to sens 

każde koło to figura 

każda figura to geometryczny obiekt 

każde konto oszczędnościowe jest kontem 

każdy samochód osobowy jest samochodem ... 

Tylko wtedy, gdy każdy obiekt nowej podklasy może być uważany za 
szczególny przypadek obiektu istniejącej klasy 

kwadrat jest szczególnym prostokątem 

koło jest szczególną elipsą 

student jest szczególną osobą 

Tylko wtedy, gdy metody nadklasy mają także sens w podklasie 

 makeVisible()

 ma sens w klasie 

Figura

 i w podklasie 

Prostokat 

 getPole()

 ma sens w klasie 

Prostokat

 i w podklasie 

Kwadrat 

 getStanKonta()

 ma sens w klasie 

Konto

 i w podklasie 

LokataKonto 

52 

Klasy wbudowane - rozszerzenia 

Termin 

rozszerzenie

 klasy oznacza stworzenie na jej podstawie podklasy i 

ewentualnie dodanie nowych elementów  

Java dysponuje olbrzymią biblioteką wbudowanych klas 

Wszystkie klasy, z wyjątkiem klas zdefiniowanych jako 

final

 

można 

rozszerzać 

aby napisać aplet tworzy się podklasę wbudowanej klasy 

Applet

, która 

zawiera metody: 

wizualizacji apletu w przeglądarce stron www 

uruchamiania i zatrzymywania apletu gdy okno przeglądarki jest odświeżane 

pisania i rysowania w obszarze apletu, korzystania z przycisków i menu 

aby zbudować w swojej aplikacji graficzny interfejs użytkownika (

GUI 

– 

Graphical User Interface

) korzysta się z klas 

Graphics, Event, Menu, Color, Window, Button, ... 

które są umieszczone w pakiecie 

java.awt 

background image

27 

53 

Pakiety 

Klasy języka Java są zebrane      
i udostępniane w pakietach 
(

packages

System pakietów ma budowę 
hierarchiczną 

 java.awt 

java.awt.color 

java.awt.image 

 java.awt.image.renderable 

java.awt.font 

Najbardziej przydatne pakiety 

java.lang 

zawiera klasy elementów języka 

 Obiekt, System, Math, String, ... 

java.applet 

java.io 

operacje wejścia/wyjścia 

java.util 

collections 

formatowane wejście (Scanner), 
data, czas, itp.. 

java.net 

komunikacja, usługi sieciowe 

java.awt 

Abstract Windowing Toolkit

Narzędzia do komunikacji z 
użytkownikiem (GUI) 

 

 

54 

Dokumentacja pakietów 

Sun Microsystems dostarcza szczegółową dokumentację 
pakietów i zawartych w nich klas w 

API documentation

Pliki można otwierać w oknie przeglądarki 

background image

28 

55 

Korzystanie z pakietów 

Korzystanie z klas zdefiniowanych w pakietach polega na podaniu w 
programie pełnej hierarchii nazw z interesującą nas klasą na końcu 

java.awt

.

Graphics 

java.awt.event

.

MouseAdapter 

Można też „otworzyć” pakiet i korzystać z zawartych w nim klas 

import

 

java.awt

.

Graphics

Aby otworzyć wszystkie klasy pakietu stosuje się 

wildcards

import

 

java.awt.*; 

import

 

javax.swing.*; 

Linia importowania pakietu (

import

) musi                                            

znajdować się na początku klasy 

Samo użycie linii 

import

 niczego nie                                                               

importuje. Jest to tylko informacja dla                                                 
kompilatora, by po natrafieniu na                                                             
nieznany identyfikator szukał definicji                                                               
we wskazanym pakiecie 

Przykład: 
 

import 

java.awt.color.*; 

import 

java.io.*; 

class 

MyClass{...} 

56 

Scanner 

– java.util 

Scanner

 

otwiera strumień 

wejściowy z pliku lub 
termianla 

Metodą 

next( )

 Scanner 

wczytuje kolejne słowo z 
wejścia 

Metodą 

nextint( )

 wczytuje 

nastepny 

int 

Scaner znalazł 

coś innego

sygnalizowany jest 

błąd 

background image

29 

57 

Klasa Applet 

Przeglądarka WWW korzysta z klasy Applet 

tworzy aplet 

 

new Applet(...) 

inicjuje aplet metodą 

 

init( ) 

uruchamia go 

 

start( ) 

po przełączeniu na inna stronę wyłącza aplet 

 

stop( ) 

po powrocie do strony włącza znowu aplet 

 

start( ) 

Za każdym razem gdy trzeba narysować aplet na ekranie 

przy starcie 

przy każdej zmianie wielkości lub pozycji okna 

wołana jest metoda 
 

paint( ) 

z sygnaturą 

void paint(Graphics g) 

Programowanie apletu polega na modyfikacji (redefinicji) 
metod  

58 

Własny Aplecik 

import 

java.applet.Applet

import

 

java.awt.*

 

public

 class Aplecik 

extends

 Applet 

    public

 

void 

paint(Graphics g){ 

       g.drawLine(50,50,200,300); 
       g.drawString("poczatek ...",50,50); 
       g.setColor(Color.blue); 
       g.drawString("...koniec",200,300); 
       g.drawOval(100,100,50,80); 
    } 

Rozszerzamy klasę 

java.applet.Applet 

Redefiniujemy 

paint() 

Używamy klasy 

java.awt.Graphics 

java.awt.Color 

Metody (paint, init, start, stop, destroy) będą wywołane na zewnątrz 
przez przeglądarkę 

   

klasy i metody przeglądarki muszą być typu 

public 

 

background image

30 

59 

BlueJ 

60 

Aplecik na stronie WWW 

Dodanie apletu do strony 
WWW w kodzie HTML 

Między znacznikami: 

 

<Applet></Applet> 

Ważniejsze parametry: 

code, width, height 

Kod apletu w 

Aplecik.class 

background image

31 

61 

Aplecik w przeglądarce 

To tylko mały aplecik 

Cóż, dosyć ładnie ...