JP SS 6 Klasy i obiekty

background image

Języki Programowania

Klasy i obiekty.

background image

R. Pełka: Języki Programowania, 2008

2

Plan wykładu

 Klasy i ich sygnatury

Tworzenie obiektów

 konstruktor
 konstruktor z parametrami

 Metody i ich rodzaje

zwracanie wyników

przekazywanie parametrów

 ochrona danych

 Komentarze

 automatyczna generacja dokumentacji

 Dziedziczenie

 podklasy
 biblioteki klas, klasy wbudowane, klasa String
 pakiety klas

Aplety języka Java

background image

R. Pełka: Języki Programowania, 2008

3

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

R. Pełka: Języki Programowania, 2008

4

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()

background image

R. Pełka: Języki Programowania, 2008

5

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

R. Pełka: Języki Programowania, 2008

6

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

background image

R. Pełka: Języki Programowania, 2008

7

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

R. Pełka: Języki Programowania, 2008

8

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:

“Steve Jobs”

name1

num1 52

background image

R. Pełka: Języki Programowania, 2008

9

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

R. Pełka: Języki Programowania, 2008

10

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

:

"Steve Jobs"

"Steve Wozniak"

name1

name2

po

:

"Steve Jobs"

background image

R. Pełka: Języki Programowania, 2008

11

Aliasy (aliases)

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

aliasami

(

aliases

)

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

R. Pełka: Języki Programowania, 2008

12

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

background image

R. Pełka: Języki Programowania, 2008

13

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

R. Pełka: Języki Programowania, 2008

14

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

background image

R. Pełka: Języki Programowania, 2008

15

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

R. Pełka: Języki Programowania, 2008

16

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)

background image

R. Pełka: Języki Programowania, 2008

17

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

R. Pełka: Języki Programowania, 2008

18

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.

background image

R. Pełka: Języki Programowania, 2008

19

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

R. Pełka: Języki Programowania, 2008

20

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( )
{

}

background image

R. Pełka: Języki Programowania, 2008

21

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

R. Pełka: Języki Programowania, 2008

22

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

background image

R. Pełka: Języki Programowania, 2008

23

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

R. Pełka: Języki Programowania, 2008

24

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

background image

R. Pełka: Języki Programowania, 2008

25

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

R. Pełka: Języki Programowania, 2008

26

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

background image

R. Pełka: Języki Programowania, 2008

27

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

background image

R. Pełka: Języki Programowania, 2008

28

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

R. Pełka: Języki Programowania, 2008

29

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();
}
}

background image

R. Pełka: Języki Programowania, 2008

30

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

class Liczba_metoda

{

int x;

public static void main(String[] args)

{

Liczba_metoda wartosc=new Liczba_metoda();

wartosc.x=5;

wartosc.pokazLiczbe();

}

void pokazLiczbe()

{

System.out.println("Liczba x= "+x);

}

}

31

A. Poniecki

: Języki Programowania, 2012

Wywoływanie metod cd.

background image

class Liczba_metoda2

{

int x;

public static void main(String[ ] args)

{

Liczba_metoda2 wartosc = new Liczba_metoda2();

wartosc.x = 5;

System.out.println("Liczba x= "+wartosc.pobierzLiczbe());

}

int pobierzLiczbe()

{

return x;

}

}

32

Wywoływanie metod cd.

A. Poniecki

: Języki Programowania, 2012

background image

R. Pełka: Języki Programowania, 2008

33

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

R. Pełka: Języki Programowania, 2008

34

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?

background image

R. Pełka: Języki Programowania, 2008

35

Wbudowana klasa

Math

Math

 Klasa ze zbiorem

funkcji matematycznych

 np.

max

,

min

,

abs

,

random

,

sin

,

log

,

i stałych matematycznych

PI

,

E

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

R. Pełka: Języki Programowania, 2008

36

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( )

background image

R. Pełka: Języki Programowania, 2008

37

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

R. Pełka: Języki Programowania, 2008

38

Klasa

String

(cd.)

background image

R. Pełka: Języki Programowania, 2008

39

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

R. Pełka: Języki Programowania, 2008

40

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

background image

R. Pełka: Języki Programowania, 2008

41

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

R. Pełka: Języki Programowania, 2008

42

Aplikacja w BlueJ

Wykonać edycję klas

MojaAplikacja

i

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

background image

R. Pełka: Języki Programowania, 2008

43

Aplikacje spakowane

.jar

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

BlueJ

w

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

R. Pełka: Języki Programowania, 2008

44

Dziedziczenie - inheritance

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

background image

R. Pełka: Języki Programowania, 2008

45

Klasa

Konto

background image

R. Pełka: Języki Programowania, 2008

46

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

background image

R. Pełka: Języki Programowania, 2008

47

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

public class Podklasa extends Nadklasa

{

String witaj;

Podklasa()

{

witaj="Dzień dobry";

}

public static void main(String[] args)

{

Podklasa t= new Podklasa();

System.out.println(t.witaj+" "+t.imie+"!");

}

}

class Nadklasa

{

String imie = "Janek";

}

A. Poniecki

: Języki Programowania, 2012

48

Podklasy cd.

background image

R. Pełka: Języki Programowania, 2008

49

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 np. metod

class

LokataKonto

extends

Konto{

// przejmujemy konstruktora
// z nadklasy

LokataKonto(String x){

super

(x);

ostatniDzienNaliczOdsetek = 0;
}
...
}

background image

R. Pełka: Języki Programowania, 2008

50

Dostęp do nadklasy

pola

private

są chronione

niedostępne również z podklas

muszą wystarczyć metody

getter

i

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

R. Pełka: Języki Programowania, 2008

51

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.

}
...

background image

R. Pełka: Języki Programowania, 2008

52

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

R. Pełka: Języki Programowania, 2008

53

Podklasy w BlueJ

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

LokataKonto

i

DebetKonto

podklasami klasy

Konto

Każdy obiekt podklasy:
-

zawiera dodatkowe metody

- dziedziczy wszystkie metody nadklasy

background image

R. Pełka: Języki Programowania, 2008

54

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

R. Pełka: Języki Programowania, 2008

55

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

background image

public class Wyjatek2

{ static void pauza() throws Exception{ }

public static void main(String[] args) throws Exception

{ String wyjatki[] ={"dzielenie","tablica"};

for (int i = 0; i < 2; i++)

{ try

{ wygeneruj(wyjatki[i]);

System.out.println("Wyjatek przy operacji typu:\"" + wyjatki[i] + "\" nie zostal

wygenerowany");

}

catch (Exception e)

{ System.out.println("Przy operacji typu \"" + wyjatki[i] + "\" wystapil wyjatek: \n" +

e.getClass() + "\n Z

nastepujaca informacja: " + e.getMessage());

}

}

pauza();

}

56

Obsługa wyjątków

A. Poniecki

: Języki Programowania, 2012

background image

static int wygeneruj(String s) throws Exception

{ try

{ if (s.equals("dzielenie"))

{ int i = 0;

return i/i;

}

if (s.equals("tablica"))

{ int t[] =new int[5] ;

return t[6];

}

return 0;

}

finally

{ System.out.println("\n[wygeneruj(\"" + s +"\") zakonczone]");

}

}

}

57

Obsługa wyjątków cd.

A. Poniecki

: Języki Programowania, 2012

background image

R. Pełka: Języki Programowania, 2008

58

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

R. Pełka: Języki Programowania, 2008

59

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)

background image

R. Pełka: Języki Programowania, 2008

60

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

R. Pełka: Języki Programowania, 2008

61

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{...}

background image

R. Pełka: Języki Programowania, 2008

62

Scanner

java.util

Scanner

otwiera strumień

wejściowy z pliku lub
terminala

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

R. Pełka: Języki Programowania, 2008

63

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

background image

R. Pełka: Języki Programowania, 2008

64

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

R. Pełka: Języki Programowania, 2008

65

BlueJ

background image

R. Pełka: Języki Programowania, 2008

66

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

R. Pełka: Języki Programowania, 2008

67

Aplecik w przeglądarce

To tylko mały aplecik

Cóż, dosyć ładnie ...

background image

import java.awt.*;

import java.applet.*;

public class Czcionki extends Applet

{

Font serif;

Font sansSerif;

Color colorrgb = null;

public void init()

{

serif= new Font("Serif", Font.BOLD, 28);

dialog= new Font("Dialog", Font.BOLD, 28);

}

public void paint(Graphics g)

{

g.setFont(serif);

g.drawString("Czcionka Serif pogrubiona", 50, 40 );

g.setColor(Color.blue);

g.setFont(dialog);

g.drawString("Czcionka Dialog w kolorze niebieskim", 50, 160 );

}

}

68

Text w apletach

A. Poniecki

: Języki Programowania, 2012

background image

Zdarzenia wiążą się z obsługą urządzeń wejściowych. Są nimi obiekty informujące

o dokonanej określonej akcji. Informacja taka trafia do obiektu określanego
mianem odbiorcy (listener).

Dla myszki: - zdarzenia to MouseEvent

- interfejs to MouseListener

-

rejestracja zdarzenia po wywołaniu metody: addMouseListener

Dla innych urządzeń w miejsce wyrazu Mouse należy umieścić właściwe określenie.

Metody:

mouseClicked(MouseEvent e) -

wywoływana po kliknięciu przyciskiem

mousePressed(MouseEvent e) -

wywoływana po wciśnięciu przycisku

mouseReleased(MouseEvent e) -

wywoływana po zwolnieniu przycisku

mouseEntered(MouseEvent e) -

wywoływana po najechaniu kursorem na obszar

komponentu

mouseExited(MouseEvent e) -

wywoływana po opuszczeniu przez kursor obszaru

komponentu

69

Obsługa zdarzeń

A. Poniecki

: Języki Programowania, 2012

background image

Program odbiera akcję zwolnienia klawiszy myszki, co

powoduje narysowanie punktu oraz pobranie i wypisanie
jego współrzędnych.

import java.awt.*;

import java.applet.*;

import java.awt.event.*;

public class Myszka extends Applet implements MouseListener

{

Point p;

String wsp="";

public void init()

{

addMouseListener(this);

}

70

Obsługa zdarzeń cd.

A. Poniecki

: Języki Programowania, 2012

background image

public void paint(Graphics g)

{

//g.drawLine(p.x, p.y, p.x, p.y);

g.drawOval(p.x, p.y, 10, 5);

g.fillOval(p.x, p.y, 10, 5);

g.drawString(wsp, 20, 20);

}

public void mouseClicked(MouseEvent e){}

public void mousePressed(MouseEvent e){}

public void mouseReleased(MouseEvent e)

{

p = e.getPoint();

wsp = "x = " + p.x + " y = " + p.y;

repaint();

}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

}

71

Obsługa zdarzeń cd.

A. Poniecki

: Języki Programowania, 2012

background image

Obsługiwane są pliki o różnych rozszerzeniach (midi, wave, au, aiff, …).

import java.applet.*;

public class Muza extends Applet

{

public void start()

{

play (getDocumentBase(), "muzyka.mid");

}

}

72

Dźwięki

A. Poniecki

: Języki Programowania, 2012

background image

import java.applet.*;

public class Muza2 extends Applet

{ AudioClip muzyczka;

public void init()

//wymagana ścieżka dostępu do pliku

{

muzyczka = getAudioClip(getDocumentBase(), "muzyka.mid");

}

public void start()

{

muzyczka.loop();

//wykonywanie w pętli

}

public void stop()

{

muzyczka.stop();

//zakończenie odtwarzania

}

}

73

A. Poniecki

: Języki Programowania, 2012

Dźwięki cd.


Wyszukiwarka

Podobne podstrony:
JP SS 7 Klasy i obiekty
JP SS 3 jezyk C klasy id 228754 Nieznany
JP SS 4 start Java
JAVA 09 klasy i obiekty(2)
JP SS 10 Interfejs graficzny
JP SS 5 podstawy Java (2)
JP SS 6 BlueJ
JP SS 7 Typy i operacje
JP SS 8 Instrukcje, pętle
JP SS 4 wprowadzenie Java
JP SS 2 algorytmy i podstawy programowania
JP SS 9 Tablice IO wyjątki
JP SS 3 jezyk C
JP SS 5 podstawy Java
JP SS 3 jezyk C
18 klasy i obiekty
07 Programowanie obiektowe klasy, obiekty, ochrona danych
JP SS 1 podstawy JP

więcej podobnych podstron