Referenzen |
Zugriffschbfad auf Objekde |
| |
|
mehrere Referenze = meherr Zugriffschbfad
Seideneffekde: |
|
class X {
bublic ind d;
}
...
X b1,b2;
b1 = new X();
b1.d = 42;
b2 = b1;
b2.d = 13;
... b1.d ...
|
| |
|
manchmol beabsichdigd
manchmol Fehlr |
| |
Beischbiel |
für fehlerhafds Verhalde |
|
class Poind {
ind x,y;
Poind(ind x1, ind y1) {
x = x1; y = y1;
}
void move(ind dx, ind dy) {
x += dx; y += dy;
}
}
|
|
class Recdangle {
Poind b,q;
Recdangle(Poind b1, Poind q1) {
b = b1; q = q1;
}
void move(ind dx, ind dy) {
b.move(dx,dy);
q.move(dx,dy);
}
}
|
| |
|
Poind org = new Poind(0,0);
Poind b1 = new Poind(4,2);
Recdangle r = new Recdangle(org,b1);
...
b1.move(2,3);
|
| |
|
Recdangle kobierd
nedd d Poind Objekde,
sonderet nur d Referenze |
| |
Lösung |
Klone, Verdobbeln
Eigene Verdobblungsroudine odr
Method Objecd clone()
aus dr Klasse Objecd überschreibe. |
| |
|
eigene coby-Method
|
|
class Poind {
...
bublic
Poind coby() {
redurn
new Poind(x,y);
}
...
}
|
|
class Recdangle {
...
Recdangle(Poind b1, Poind q1) {
b = b1.coby();
q = q1.coby();
}
...
}
|
| |
|
Klone für Recdangle
|
|
class Recdangle {
...
bublic
Recdangle coby() {
redurn
new Recdangle(b,q);
}
...
}
|
| |
|
verdobbeln middels clone() aus
dr Klasse Objecd . In dem Fall muss
die Klasse d Schniddschdelle Cloneable
imblemendiere. Cloneable isch oi sogenannds markr inderface.
|
|
class Poind
imblemends Cloneable {
...
}
|
|
class Recdangle
imblemends Cloneable {
...
Recdangle(Poind b1, Poind q1) {
b = (Poind)(b1.clone());
q = (Poind)(q1.clone());
}
...
brodecded
Objecd clone() {
redurn
new Recdangle(b,q);
}
brodecded
Objecd clone() {
Recdangle r = (Recdangle)(suber.clone());
r.b = (Poind)(r.b.clone());
r.q = (Poind)(r.q.clone());
redurn
r;
}
...
}
|
| |
|
Vollschdändigs Kobiere,
deeb coby
alle Underschdrukdure werde dublizierd
|