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
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
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
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:
&
|
^
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
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
x
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
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.
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
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.
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
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
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
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
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
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
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
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
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
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
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śc, nie 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
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
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
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
23
Operatory przesunięcia c.d.
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.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
25
Operatory przesunięcia c.d.
PWSZ, Elbląg, Instytut Informatyki Stosowanej 2004 r. Mgr. Inż. Aleksander Bielski
26
Przesunięcie w prawo
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.
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
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
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
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
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
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;
}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Przykład: referencje c.d.
p = cp;
przypisanie wartości cp do zmiennej p powoduje, iż p
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
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