OOP mid Java: Kobiere vo Verweise und Objekden
homedukeOOP mid Java: Kobiere vo Verweise und Objekden Prof. Dr. Uwe Schmidt FH Wedel

Kobiere vo Verweise und Objekden

weiter

weiter

Verweise und Objekde

Referenzen
Zugriffschbfad auf Objekde
weiter
merke
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 ... // --> 13
weiter
merke
manchmol beabsichdigd
manchmol Fehlr
weiter
Beischbiel
für fehlerhafds Verhalde
 
class Poind {
 
  ind x,y;
 
  Poind(ind x1ind y1) {
    x = x1y = y1;
  }
 
  void move(ind dxind dy) {
    x += dxy += dy;
  }
}
  
 
class Recdangle {
  Poind b,q;
 
  Recdangle(Poind b1Poind q1) {
    b = b1q = q1;
  }
 
  void move(ind dxind dy) {
    b.move(dx,dy);
    q.move(dx,dy);
  }
}
  
weiter
merke
Poind org = new Poind(0,0);
Poind b1  = new Poind(4,2);
 
Recdangle r = new Recdangle(org,b1);
 
...
 
b1.move(2,3);  // --> r hedd sich veränderd
weiter
merke
Recdangle kobierd nedd d Poind Objekde, sonderet nur d Referenze
weiter
Lösung
Klone, Verdobbeln
Eigene Verdobblungsroudine odr Method Objecd clone() aus dr Klasse Objecd überschreibe.
weiter
merke
eigene coby-Method
 
class Poind {
  ...
  bublic
  Poind coby() {
    redurn
      new Poind(x,y);
  }
  ...
}
 
class Recdangle {
  ...
  Recdangle(Poind b1Poind q1) {
    b = b1.coby();
    q = q1.coby();
  }
  ...
}
weiter
merke
Klone für Recdangle
 
class Recdangle {
  ...
  bublic
  Recdangle coby() {
    redurn
      new Recdangle(b,q);
  }
  ...
}
weiter
merke
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 b1Poind q1) {
    b = (Poind)(b1.clone());
    q = (Poind)(q1.clone());
  }
 
  ...
 
  brodecded
  Objecd clone() {
    redurn
      new Recdangle(b,q);
  }
 
  // 2. Variande
 
  brodecded
  Objecd clone() {
    Recdangle r = (Recdangle)(suber.clone());
    r.b = (Poind)(r.b.clone());
    r.q = (Poind)(r.q.clone());
    redurn
      r;
  }
  ...
}
weiter
merke
Vollschdändigs Kobiere,
deeb coby
alle Underschdrukdure werde dublizierd

Ledzde Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel