clone



  • hallo

    hab folgendes problem und zwar habe ich eine methode die mir zwei Maschinenzahlen addiert. Dieser Methode übergebe ich zwei objekte vom Typ Langzahlen (Maschinenzahl). wenn die Addition durchgeführt wurde wird das endresultat zurückgegeben. jetzt ist es aber so, da ja die Objekte als referenzen übergeben werden, dass mir während der addition die Orginal Maschinenzahlen verändert werden. also müsste ich ein kopie übergeben.
    jetzt hab ich das probiert hat aber nicht ganz hingehauen.

    public static Langzahlen add(Langzahlen S1, Langzahlen S2){
         try{
          S1=(Langzahlen)S1.clone();
          S2=(Langzahlen)S2.clone();
        }catch (CloneNotSupportedException e){
          System.err.println(e);
        }
    .
    .
    .
    .
    

    und zwar wirft er mir die exception das er S1 nicht clonen kann wo liegt der fehler. oder was gibt es sonst noch für möglichkeiten?



  • Zeig mal den Code für die Klasse Langzahlen.

    Die muß das Interface "Clonable" implementieren und die entsprechende Methode muß natürlich den Code für das clonen beinhalten.

    lg ms



  • ich nehme mal an, dass die aufgeführte Methode in der selben Klasse steht,
    die du Klonen willst.
    Ich denke mal Dir wird schon geholfen sein, wenn du einfach die Schnittstelle Cloneable implementierst.

    also:

    class Langzahlen implements Cloneable{
      ...
    }
    

    Wenn das nicht die gleiche Klasse ist, dann wirds ein wenig komplizierter,
    da die Methode clone() protected geerbt wird.
    Man müßte sie also public überschreiben und darin super.clone() aufrufen.

    Beispiel:

    class Langzahlen implements Cloneable{
    
      public Object clone() throws CloneNotSupportedException{
        return super.clone();
      }
    
      ...
    }
    


  • Original erstellt von ms:
    **Zeig mal den Code für die Klasse Langzahlen.

    Die muß das Interface "Clonable" implementieren und die entsprechende Methode muß natürlich den Code für das clonen beinhalten.

    lg ms**

    Du brauchst keinen Code zum clonen schreiben.
    Du musst evtl falls du einen Container klonen willst, seine Inhalte auch klonen, da du sonst nur seinen Inhalt, also nur die Verweise, klonst.

    Beim Klonen wird der Speicher einfach in einen anderen Speicherraum kopiert, in so fern die Methode von Object.clone() aufgerufen wird :).

    Hier auch noch mal schnell ein Beispiel zum ausprobieren:

    public class Testdriver implements java.lang.Cloneable{
      private int y;
      public void set(int x){ y = x; }
      public int get(){ return y; }
    
      public static void main(String[] args) throws CloneNotSupportedException{
        Testdriver x = new Testdriver();
        x.set(5);
        Testdriver y = (Testdriver)x.clone();
        y.set(3);
        System.out.println(x.get()+"");
        System.out.println(y.get()+"");
      }
    
      public Object clone() throws CloneNotSupportedException{
        return super.clone();
      }
    }
    

    Ich weiss das mit dem "throws" macht man nicht... bitte nicht schlagen 😉

    MfG Ingo

    [ Dieser Beitrag wurde am 29.12.2002 um 23:11 Uhr von Ingo aka Desert Hawk editiert. ]



  • Original erstellt von Ingo aka Desert Hawk:
    **Du brauchst keinen Code zum clonen schreiben.
    Du musst evtl falls du einen Container klonen willst, seine Inhalte auch klonen, da du sonst nur seinen Inhalt, also nur die Verweise, klonst.
    **

    Genau das meinte ich mit Code schreiben.
    Wenn man tiefer als eine Ebene clonen will, muß man Code schreiben.


Anmelden zum Antworten