background image

Programowanie.

Wykład 3.  Operatory, referencje, obiekty

Mgr.inż. Aleksander Bielski

alex@iis.pwsz.elblag.pl

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

1

background image

Program wykładu

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

2

1) Operatory numeryczne.

2) Operacje bitowe

3) Operatory logiczne
4) Operator warunkowy

5) Typy referencyjne

6) Klasa Object

background image

Operatory numeryczne

unarny (jednoargumentowy): plus 

+

 i minus 

-

mnożenia i  dzielenia:  

*

/

%

 

dodawania 

+

  i odejmowania 

-

inkrementacji: 

++

  (dwie formy – prefiks i sufiks /lub 

przedrostkowa i przyrostkowa/  )

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

3

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

4

Operatory numeryczne c.d.

dekrementacji: 

--

   (dwie  formy  –  prefiks  i  sufiks  /lub 

przedrostkowa i przyrostkowa/ )
znakowy i bezznakowy operator przesunięcia (tylko wartości 
całkowite): 

<<

 >>

>>>

 

bitowy operator dopełniający: 

~

 

bitowe operatory:

|

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

5

Jednoargumentowy (unarny) 

+

 i 

-

Argumentem musi być jeden z typów numerycznych

W  czasie  wykonywania  programu  wartość  wyrażenia  z 
jednoargumentowym  minusem  jest  negacją  arytmetyczną 

wartości operanda (ekwiwalent odejmowania od zera)

Negacja  maksymalnie  ujemnej  wartości  typu  int  (

??

)  lub  long

daje  w  wyniku  taką  samą  wartość.  (W  tym  przypadku  jest 

przepełnienie, ale nie ma wyjątku)

Dla wszystkich wartości całkowitych  

x

-x

 równe jest 

(~x)+1

.

Przykład: program p4/Test.java

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

6

Jednoargumentowy (unarny) minus 

-

Dla  wartości  zmiennoprzecinkowych  negacja  nie  jest 
równoznaczna  z  odejmowaniem  od  zera,  ponieważ  jeśli 

jest 

+0.0

,  wtedy 

0.0-x

 daje 

+0.0

,  ale 

-x

 daje 

-0.0

.  Unarny  minus 

jedynie zmienia znak liczby zmiennoprzecinkowej.  

Specjalne przypadki:

Jeśli operand jest NaN, wynik jest NaN 

Jeśli operand jest nieskonczonością, wynik jest nieskończonością 
o przeciwnym znaku
Jeśli operand jest zerem, wynik jest zerem o przeciwnym znaku

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

7

Operator  

*

Wartości całkowite – możliwe przepełnienie

Dla wartości zmiennoprzecinkowych wg IEEE 754 : 

Jeśli  co  najmniej  jeden  z  operandów  jest  NaN,  wynik  jest 

NaN. 

Jeśli  wynik  nie  jest  NaN,  znak  wyniku  jest  dodatni    jeśli 

obydwa operandy mają jednakowe znaki, oraz ujemny, jeżeli 

znaki operandów są różne

Wynikiem mnożenia nieskończoności i zera jest  NaN.

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

8

Operator  

c.d.

Wynikiem  operacji  mnożenia  nieskończonośći  i  wartości 

skończonej jest nieskończoność ze znakiem, który określamy 

zgodnie z poprzednimi regułami. 

W pozostałych przypadkach (bez nieskoności i NaN):

wynik jest typu float lub double

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

9

Operator  

Może  wywołać  wyjątek  w  przypadku  dzielenia  przez  zero 

( ArithmeticException)

Jeśli co najmniej jeden z operandów jest  NaN, wynik jest NaN. 

Jeśli wynik nie jest NaN, znak wyniku jest dodatni  jeśli obydwa 

operandy  mają  jednakowe  znaki,  oraz  ujemny,  jeżeli  znaki 

operandów są różne

Dzielenie nieskończoności przez nieskończoność daje NaN

Dzielenie  nieskończoności  przez  wartość  skończoną    daje 

nieskończoność  ze  znakiem,  który  określamy  zgodnie  z 
poprzednimi regułami. 

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

10

Operator  

Binarny operator, zwraca resztę z dzielenia

Operandy mogą być typów całkowitych i zmiennoprzecinkowych

Operator po lewej stronie znaku 

%

 nazywamy dzielną , po prawej 

dzielnikiem

Dla liczb całkowitych wynik 

(a/b)*b+(a%b) 

równa się 

a

Jeśli  dzielnikiem  jest  0  (całkowite)  ,  to  wygenerowany  będzie 
wyjątek ArithmeticException

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

11

Operator  

%

 - 

przykłady

 

Przykłady:

5%3

 

daje w wyniku 

2

( 5/3 daje w wyniku 1)

5%(-3)

 

daje w wyniku 

2

( 5/(-3) daje w wyniku -1)

(-5)%3

 

daje w wyniku 

-2

( (-5)/3 daje w wyniku -1)

(-5)%(-3)

 

daje w wyniku 

-2

( (-5)/(-3) daje w wyniku 1)

5.0%3.0

 

daje w wyniku 

2.0

5.0%(-3.0)

 

daje w wyniku 

2.0

(-5.0)%3.0

 

daje w wyniku  

-2.0

(-5.0)%(-3.0)

  daje w wyniku  

-2.0

przykład: p5/Test.java

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

12

Operator  

- reguły

 

Jeśli co najmniej jeden z operandów jest  NaN, wynik jest NaN. 
Jeśli  wynik  nie  jest  NaN, 

znak  wyniku

 jest  taki  sam  jak  znak 

dzielnej

Dzielenie nieskończoności przez nieskończoność daje NaN
Jeśli  dzielna  jest  nieskończonością  lub  dzielnik  jest  zerem  (oraz 

obydwa przypadki naraz), wynikiem jest NaN
Jeśli  dzielna  jest  wartością  skończoną  i  dzielnik  jest 

nieskończonością, wynik jest równy dzielnej
Jeśli dzielna jest zerem i dzielnik jest wartością skończoną to wynik 
jest równy dzielnej

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

13

Operator  

- reguły

 

c.d.

W pozostałych przypadkach (gdy nie ma nieskończoności, NaN lub 
zera)  dla  wartości  zmiennoprzecinkowych  reszta 

r

 dzielenia 

dzielnej 

n

 przez dzialnik 

d

 jest określana wzorem:

r = n – (d * q)

   
      gdzie 

q

 jest  wartością  całkowitą  dodatnią  tylko  jeżeli 

n/d

 jest 

dodatnie, oraz ujemną tylko jeśli 

n/d

 jest ujemne

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

14

Operatory  dodawania i odejmowania (typy numeryczne)

Jeśli typ operandów jest całkowity (int lub long) wynik operacji 
również jest typu całkowitego

Jeśli  w  wyniku  dodawania  jest  przepełnienie,  wtedy  znak 

wyniku  nie  będzie  taki  jak  w  wyniku  sumy  matematycznej 

wartości operatorów.
Wynik  operacji  dla  wartości  zmiennoprzecinkowych  jest 

określany wg IEEE 754

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

15

Operatory  dodawania i odejmowania: 

zmiennoprzecinkowe

Jeśli  co  najmniej  jeden  z  operandów  jest  NaN,  wynik  jest 

NaN. 

Suma  dwóch  wartości  nieskończonych  o  przeciwnych 

znakach jest NaN

Suma  dwóch  wartości  nieskończonych  o  jednakowych 

znakach jest nieskończoność o takim samym znaku

Suma  nieskończoności  i  wartości  skończonej  równa  jest 
operandowi o wartości nieskończonej

Suma dwóczh zer o znakach przeciwnych daje zero dodatnie

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

16

Operatory  dodawania i odejmowania: 

zmiennoprzecinkowe c.d.

Suma dwóch wartości zerowych o takim samym znaku daje zero 
o tym znaku

Suma zera i skończonej wartości różnej od zera daje w wyniku 

operand niezerowy

Suma  dwóch  niezerowych  skończonych  wartości  tej  samej 

wielkości o znakach przeciwnych daje dodatnie zero

W  pozostałych  przypadkach  jest  liczona  dokładna  suma 

matematyczna

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

17

Porównanie z wartością NaN

Dla  dowolnego  x  (włączając  NaN)  wynikiem  poniższych 

operacji jest false:

x < Float.NaN 

x <= Float.NaN 

x == Float.NaN 

x > Float.NaN 
x >= Float.NaN

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

18

Porównanie z wartością NaN

W wyniku testów:

Float.NaN != Float.NaN 

oraz

Double.NaN != Double.NaN  

otrzymujemy true

Najlepszym sposobem sprawdzenia i porównania wyników obliczeń 

z wartością NaN jest użycie metod statycznych  

Float.isNaN(float)

 

lub 

Double.isNaN(double)

 z pakietu 

java.lang 

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

19

Operator  inkrementacji i dekrementacji

Dwie formy : 

Prefiks   /przedrostkowa:  

np. 

++x,  ++liczba

Sufiks   /przyrostkowa: 

np. 

x--,  liczba--

Wynik  wyrażenia  musi  być  zapamiętany  w  zmiennej  jednego  z 

typów numerycznych, inaczej – błąd kompilacji
Wynikiem wyrażenia jest wartość, nie zmienna
Wynikiem wyrażenia prefiksowego jest wartość zmiennej już po 

obliczeniu i zapamiętaniu nowej wartości
 Wynikiem wyrażenia postfiksowego jest wartość zmiennej przed 
obliczeniem i zapamiętaniem nowej wartości

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

20

Operator  inkrementacji i dekrementacji

Wyjątek:

Do  zmiennej  zadeklarowanej  jako 

final

 nie  może  być 

zastosowana  żadna  z  operacji  inkrementacji  lub  dekrementacji 

dlatego, że gdy uzyskujemy dostęp do zmiennej 

final

 w wyrażeniu, 

otrzymujemy wartoścnie zmienną

Przykłady:

int x=z=5, y;

y=x++;

 // po wykonaniu instrukcji wartość x wynosi 6, wartość y 

równa się 5

z=--x;

 

// wartość x wynosi 5, wartość z równa się 5

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

21

Operatory przesunięcia

Rodzaje operatorów:

lewy shift 

<<

znakowy prawy shift 

>>

bezznakowy prawy shift 

>>>

operandy:

operand po lewej stronie operatora zawiera wartość, która będzie 

przesuwana

operand  po  prawej  stronie  wskazuje  odległość  przesunięcia  w 

bitach 

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

22

Operatory przesunięcia c.d.

Operandy muszą być typów podstawowych
Jeśli  typ  lewego  operanda  int,  wartość  operanda  prawego  może  być  w 

zakresie od 0 do 31 włącznie

Jeśli typ lewego operanda long, wartość operanda prawego może być w 

zakresie od 0 do 63 włącznie

n<<s

   jest równoznaczne z  

n*2

s

n>>s

   jest równoznaczne z 

n>>>s

   jest równoznaczne z:

 

n>>s

 w przypadku gdy n jest dodatnie, 

 

(n>>s)+(2<<~s)

 gdy n jest typu int ujemne

(n>>s)+(2L<<~s)

 gdy n jest typu long ujemne

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

23

Operatory przesunięcia c.d.

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

24

Operatory przesunięcia: reguły

Pyt.1:  Co  się  dzieję  z  bitami,  które  się  ”nie 

mieszczą” i wychodzą poza liczbę?
Pyt.2:  Co  sie  umieszcza  w  miejsce  brakujących 

bitów?

Odp.1: Bity są odrzucane

Odp.2: 

W  przypadku  operacji 

<<

 oraz  bezznakowej 

operacji 

>>>

 nowe bity mają wartość 

0

.

W  przypadku  operacji 

>> 

nowe  bity  otrzymują 

wartość taką jak najbardziej znaczący bit przed 

operacją przesunięcia.

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

25

Operatory przesunięcia c.d.

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

26

Przesunięcie w prawo 

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

27

Przesunięcie w prawo: typ byte

W tym przypadku odbywa się rozszerzenie typu byte 
na 

int. 

Otrzymany 

wynik 

różni 

się 

od 

oczekiwanego,  więc  nie  należy  stosować  operacji 
>>> z liczbami krótszymi od int.

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

28

Bitowy operator dopełniający 

~

Operandy muszą być typów podstawowych

W  czasie  wykonywania  wartość  wyrażenia  jest  bitowym 

dopełnieniem wartości operanda:

 

~x

 równa się  

(-x)-1

Inaczej mówiąc, operator ~ konwertuje wszystkie bity o wartości 

0 na 1 , a  bity o wartości 1 na 0:

dla wartości bitowej  00001111   wynik jest 11110000.

przykład: program p6/Test.java

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

29

Operacje bitowe: AND, OR, XOR

A B A*B

0 0

0

0 1

0

1 0

0

1 1

1

A

B A^B

0

0

0

0

1

1

1

0

1

1

1

0

A

B A|B

0

0

0

0

1

1

1

0

1

1

1

1

AND

OR

XOR

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

30

Całkowite bitowe operatory 

&

,

 ^ 

,

 |

 & - wynik jest bitowym 

i

 (AND) operandów

  ^  -  wynik  jest  bitowym 

wyłącznym

 

LUB

 (XOR) 

operandów

 | - wynik jest bitowym 

LUB

 (OR) operandów

background image

Operatory logiczne

Relacji: 

==

  i  

!=

 

logicznego dopełnienia: 

!

 

Logiczne: 

^

Warunkowe  

i

  oraz 

lub

:        

&&  

 ||

 

warunkowy:

? :

łańcuchowy plus 

+

 : konwertuje operand typu boolean 

na typ  String ("true" lub "false"), następnie tworzy 

nowy łańcuch typu  String , który jest sumą 

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

31

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

32

Logiczny operator dopełniający 

!

Jednoargumentowy

Operand musi być typy boolean

Typ wyniku – boolean
W czasie wykonywania wartość wyrażenia jest:

 

true

 jeżeli operand ma wartość 

false

 

false

 jeżeli operand ma wartość 

true

background image

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

33

Logiczny operator dopełniający 

! c.d.

Operator 

!

 często  jest  częścią  instrukcji 

if()

.  Poniższe  elementy 

programów wykonują te same czynności:

public Object myMethod(Object x) { 

if (x instanceof String) { 

// nic nie robimy

 


else { 

x = x.toString(); 


return x; 

}

public Object myMethod(Object x) { 

if (!(x instanceof String)) { 

x = x.toString();

return x; 
}

background image

Logiczne operatory  

==

 i 

!=

 

Wynik  operacji  

==

 jest  true  jeśi  obydwa  operandy 

jednocześnie  mają taką samą wartość logiczną, inaczej 
wynik jest false.

Wynik  operacji 

!= 

jest  false  jeśi  obydwa  operandy 

jednocześnie  mają taką samą wartość logiczną, inaczej 
wynik jest true.

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

34

background image

Referencje a logiczne operatory  

==

 i 

!=

 

Jeśli obydwa operandy są typu referencyjnego lub typu 

null, wtedy operacja porównuje obiekty
W czasie wykonywania wynik operacji 

==

 jest true jeśli 

obydwa  operandy  jednocześnie  mają  wartość  null  albo 

odwołują  się  do  tego  samego  obiektu  lub  tablicy;  w 

przeciwnym przypadku wynikiem jest false.
Wynik  operacji 

!=

 jest  false  jeśli  obydwa  operandy 

jednocześnie  mają  wartość  null  albo  odwołują  się  do 

tego  samego  obiektu  lub  tablicy;  w  przeciwnym 

przypadku wynikiem jest true.

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

35

background image

Obiekty String a logiczny operator  

==

 

Porównujemy  tylko  referencje,  nie  zawartość

obiektów klasy String
Porównanie  zawartości  dwóch  obiektów 

s

 i 

t

 klasy 

String  można  wykonać  stosując  metodę  klasy  String  : 

s.equals(t)

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

36

background image

 Logiczne Operatory 

&

^

,  

|

Gdy  obydwa  operandy  są  typu  boolean,  wtedy  typ 

wyrażenia boolean

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

37

A

B

A & B

False

False

False

False

True

False

True

False

False

True

True

True

A

B

A ^ B

False

False

False

False

True

True

True

False

True

True

True

False

A

B

A | B

False

False

False

False

True

True

True

False

True

True

True

True

background image

 Operator warunkowego 

I (AND) 

&&

Działanie jest podobne do operatora 

&

Każdy operand musi mieć typ boolean

Wynik wyrażenia zawsze ma typ boolean

Wartość  operanda  po  prawej  stronie  jest 

obliczana  tylko  wtedy,  gdy  wartość  lewego 
operanda jest true

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

38

background image

 Operator warunkowego 

LUB (OR) 

||

Działanie jest podobne do operatora 

|

Wartość  operanda  po  prawej  stronie  jest 

obliczana  tylko  wtedy,  gdy  wartość  lewego 

operanda jest false

Każdy operand musi mieć typ boolean

Wynik wyrażenia zawsze ma typ boolean

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

39

background image

Operator warunkowy 

? :

Używa wartości logicznej lub wyrażenia logicznego do 

określenia które z dwóch wyrażeń zostanie wykonane

Zawiera trzy wyrażenia:

Pierwsze – typu logicznego (boolean)

Drugie i trzecie: jednego z typów numerycznych, typu 

boolean, typu referencyjnego lub null

Sposób wykonania

Grupowanie od prawej do lewej:

 

a?b:c?d:e?f:g

  oznacza to samo co 

a?b:(c?d:(e?f:g))

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

40

background image

Operator warunkowy – typ wyrażenia

Jeśli  drugi  i  trzeci  operand  mają  ten  sam  typ  (również 

null),  wtedy  wyrażenie  warunkowe  będzie  miało  taki 

sam typ 
W  przeciwnym  przypadku,  jeżeli  te  operandy  są   

numeryczne, to:
jeśli  jeden  z  operandów  jest  typu  byte,  drugi  –  short, 

wynik jest typu short
jeśli  jeden  z  operandów  jest typu  T (gdzie T jest byte

short lub  char), a drugi operand jest wyrażeniem stałym 

typu  int  (z  tym,  ze  wartość  wyrażenia  może  być 

reprezentowana  przez  T,  wtedy  typ  wyrażenia 

warunkowego jest T.

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

41

background image

Operator warunkowy – typ wyrażenia c.d.

Jeśli  drugi  lub  trzeci  operator  mają  typ  null  ,  a 
jeden  z  nich  jest  typu  referencyjnego,  to 

wynikiem  wyrażenia  warunkowego  będzie  ten 

typ referencyjny
Jeśli  drugi  i  trzeci  operator  należą  do  różnych 
typów  referencyjnych,  wtedy  musi  istnieć 

możliwość  konwersji  jednego  z  tych  typów  na 

drugi (powiedzmy – typ T), wtedy typ wyrażenia 

warunkowego również jest T

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

42

background image

Operator rzutowania typów

Jest używany do wymuszenia zmiany typu wyrażenia

Rzutowanie  może  być  użyte  do  zmiany  typu  wartości 
podstawowych, np. zamieniając wartość double na int:

int obszar = (int)(Math.PI * diameter);

Można stosować również do typów referencyjnych, np. :
 

Vector v = new Vector(); 

 v.add (” Hello” ); 
 String s = (String)v.get(0);

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

43

background image

Wyrażenia logiczne

Umożliwiają sterowanie wykonaniem :

instrukcji warunkowej 

if

instrukcji 

while

 

instrukcji 

do

instrukcji 

for

 

wyrażenie logiczne również określa która instrukcją zostanie 
wykonana w operatorze warunkowym 

? :

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

44

background image

Typy referencyjne

Klasa - 

class

interfejs – 

interface

Tablicowy – 

array

Uwaga:

typ specjalny  - 

null

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

45

background image

Typy referencyjne c.d.

Przykład: 

class Punkt { int[ ] metryka; }
interface Przesun { 

void przesun(int deltax, int deltay); 

}
deklaracja  klasy  typu  Punkt,  interfejsu  typu 
Przesun,  i  tablicy  typu  int[  ]  do  deklaracji  pola 

metryka klasy Punkt

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

46

background image

Obiekty

obiekt  reprezentuje  pojedynczy  element 

klasy lub może być tablicą

referencje – są wskaznikami do obiektów

referencja  null  nie  wskazuje  na  żaden 

obiekt

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

47

background image

Utworzenie obiektu

Dwie formy tworzenia obiektu:

Utworzenie obiektu przy użyciu operacji 

new

 

Utworzenie  obiektu  z  użyciem  wyrażenia 

rozpoczynającego  się  od 

Primary

 –  umożliwia 

utworzenie obiektów klas wewnętrznych i podklas 

anonimowych
Uwaga
zastosowanie  operatora 

+

 np.  w  wyrażeniach  z 

obiektami  String  powoduje  utworzenie  nowego 

obiektu klasy String w sposób niejawny

przykład: p1/Test.java

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

48

background image

Utworzenie obiektu: 1

class Punkt {

int x, y;
Punkt( ) { System.out.println("konstruktor domyslny"); }
Punkt(int x, int y) { this.x = x; this.y = y; }

// Obiekt klasy Punkt jest tworzony w czasie inicjalizacji klasy

static Punkt origin = new Punkt(0,0);

// String - niejawne utworzenie przy użyciu operatora + 

public String toString( ) {

return "(" + x + "," + y + ")";

}

}

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

49

background image

Utworzenie obiektu: 2

class Test {

public static void main(String[ ] args) {

// Utworzenie obiektu Punkt z użyciem newInstance:

Punkt p = null;
try {

p = (Punkt)Class.forName("Punkt").newInstance();


catch (Exception e) {

System.out.println(e);

}

// Tablicę utworzymy przy użyciu konstruktora tablicowego:

Punkt a[ ] = { new Punkt(0,0), new Punkt(1,1) };

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

50

background image

Utworzenie obiektu: 3

// String - utworzenie przy użyciu operatora + 

System.out.println("p: " + p);
System.out.println("a: { " + a[0] + ", " + a[1] + " }");

// Tablicę utworzymy przy użyciu 

//wyrażenia tworzącego tablicę

String sa[ ] = new String[2];
sa[0] = "he"; sa[1] = "llo";

System.out.println(sa[0] + sa[1]);

}

}

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

51

background image

Referencje do obiektu: operatory

Operatory na referencjach do obiektu:

Umożliwiają dostęp do pól z użyciem nazwy kwalifikowanej 

(

this.x, this.y

) lub wyrażenia dostępu do pola

Wywołanie metody

Operator rzutowania:

 

p = (Punkt)Class.forName("Punkt").newInstance();

Operator 

+

 dla klasy String

Operator 

instanceof

 

Operatory równości 

==

 i 

!=

Operator warunkowy

 ? :

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

52

background image

Referencje do obiektu

Można utworzyć wiele referencji do tego samego obiektu.

Przykład: p2/Test.java

v1.val = 5;

Value v2 = v1;

Następnie w linijce :

v2.val = 6;

zmienia  się  wartość  pola  obiektu

 v1

,  jest  to  skutkiem 

wielokrotnego wskazania na ten sam obiekt. 

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

53

background image

Klasa Obiekt

Jest nadklasą (klasą macierzystą) wszystkich innych 

klas w Javie

Zmienna  typu  Object  może  być  referencją  do 

dowolnego obiektu lub tablicy

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

54

background image

Klasa Obiekt: metody, c.d.

    getClass

 zwraca  klasę  obiektu.  Można  użyć  np.  do  wykrycia 

pełnej nazwy klasy, jej nadklasy, zaimplementowanych interfejsów

   toString

 zwraca reprezentację obiektu w postaci String

   equals

 – służy do porównania obiektów  

   clone

 – jest używana do tworzenia kopii obiektu

  wait

notify

,  and 

notifyAll

 –  używane  są  w  programowaniu 

współbieżnym z użyciem wątków

   

finalize

 -  jest  uruchamiana  bezpośrednio  przed  zniszczeniem 

obiektu

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

55

background image

Operator instanceof

Umożliwia testowanie klasy obiektu w czasie wykonywania

Lewy argument może być dowolnym wyrażeniem typu referencja 

do  obiektu,  zwykle  zmienna  lub  element  tablicy,  prawy  operand 
musi być typu: klasa, interfejs, tablica.

Operator instanceof zwraca true jeśli lewy operand jest tej samej 
klasy lub podklasy jak i prawy.

Prawy  operand  może  być  również  typu  interface,  wtedy  test 

określa  czy  obiekt  będący  lewym  argumentem  implementuje  ten 
interfejs.

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

56

background image

Operator instanceof

public class Classroom { 

private Hashtable inTheRoom = new Hashtable(); 
public void enterRoom(Person p) { 

inTheRoom.put(p.getName(), p); 


public Person getParent(String name) { 

Object p = inTheRoom.get(name); 
if (p instanceof Parent) { 

return (Parent)p; 


else { 

return null; 

}

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

57

background image

Typy, klasy, interfejsy

public interface Kolorowy {

void ustawKolor(byte r, byte g, byte b);

}

class Punkt { int x, y; }

class KolorowyPunkt extends Punkt implements Kolorowy {

byte r, g, b;

public void ustawKolor(byte rv, byte gv, byte bv) {

r = rv; 

g = gv; 

b = bv;

}

}

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

58

background image

Typy, klasy, interfejsy c.d.

class Test {

public static void main(String[] args) {

Punkt p = new Punkt();
KolorowyPunkt cp = new KolorowyPunkt();
p = cp;
Kolorowy c = cp;

}

}
Uwaga: kod programu znajduje się w katalogu p3

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

59

background image

Przykład: referencje

Punkt

 p = 

new

 Punkt();

Zmienna lokalna p metody main w klasie Test ma typ 

Punkt

 jej wartością początkową jest 

referencja

 

do

 nowego 

obiektu

 

klasy 

Punkt

.

KolorowyPunkt

 cp = 

new

 KolorowyPunkt();

Podobnie zmienna lokalna cp ma typ  

KolorowyPunkt

 oraz 

do niej jest  przypisana wartość referencji do nowego obiektu 
klasy 

KolorowyPunkt

.

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

60

background image

Przykład: referencje c.d.

p = cp;

przypisanie  wartości  cp  do  zmiennej   powoduje,  iż  

zawiera  

referencję

 do obiektu klasy 

KolorowyPunkt.

obiekt  klasy

 KolorowyPunkt

 zawiera  wszystkie 

metody

klasy 

Punkt

, oraz również 

pola

 r,g,b oraz x,y.

Kolorowy c = cp;

Zmienna  lokalna  c  ma  typ  interfejsu  Kolorowy,  dlatego 

może zawierać referencję do dowolnego obiektu, którego 
klasa  implementuje  ten  interfejs  (tu  –  klasa 

KolorowyPunkt

).

Uwaga:  wyrażenie 

new Kolorowy() 

nie jest prawidłowe – 

nie można utworzyć obiektu typu interfejs

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

61

background image

Klasy i tablice

Każda tablica również ma klasę; metoda 

getClass

 użyta 

dla  objektu tablicowego  zwróci obiekt,który  reprezentuje 
klasę dla danej tablicy.

Klasy  dla  tablic  mają  dość  dziwne  nazwy,  które  nie  są 

prawidłowymi identyfikatorami.

Naprzykład, wartość wyrażenia:

new int[10].getClass().getName()

jest łańcuchem "

[I

"

PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski

62