Objekte kopieren ?

Frankster

Mitglied
Hi!

Ich bin ein totaler Java Neuling, und arbeite mich gerade durch ein Java Tutorial durch und an manchen Aufgaben komm ich nicht weiter :-(

http://www.gailer-net.de/tutorials/java/Notes/chap33/progExercises33.html
Aufgabe 3

Fügen Sie der Box-Klasse einen neuen Konstruktor hinzu:

Box( Box alteBox )

Der Konstruktor erzeugt ein neues Box-Objekt mit genau den gleichen Dimensionen des alten Box-Objekts. Natürlich wird das alte Objekt nicht verändert.


Code:
import java.io.*;

class Box
{
	private int hoehe, breite, tiefe;
	
	Box (int hoehe, int breite, int tiefe)
	{
		this.hoehe = hoehe;
		this.breite = breite;
		this.tiefe = tiefe;
	}
	
	Box(Box alteBox )
	{
		this.breite = alteBox.breite;
		this.hoehe = alteBox.hoehe;
		this.tiefe = alteBox.tiefe;
	}
	
	private int flaecheVorn()
	{
		return (breite*hoehe);
	}
	
	private int flaecheSeite()
	{
		return (hoehe*tiefe);
	}
	
	private int flaecheOben()
	{
		return (tiefe*breite);
	}
	
	public int flaeche()
	{
		return (2*flaecheVorn() + 2*flaecheSeite() + 2*flaecheOben());
	}
	
	public int volumen()
	{
		return (hoehe*tiefe*breite);
	}
	
}

class Kapitel33_1
{
	public static void main(String[] args)
	{
		Box box1 = new Box(2,5,10);
		Box box2 = new Box(box1);

		
		System.out.println(box2.flaeche());
		System.out.println(box2.volumen());
		
	}
}

Ich erzeuge ein Box Objekt box1. Anschliessend erzeuge ich ein box2 Objekt und übergebe das box1 Objekt an den Konstruktor Box(Box alteBox )

Stimmt dies, was ich im Konstruktor Box(Box alteBox ) mache ?

Der Punkt mit den Zugriffsmethoden ist mir dann klar, nur bei dem stehe ich an

Vielen Dank im voraus
Frankster
 
Frankster hat gesagt.:
Hi!

Code:
import java.io.*;

class Box
{
	private int hoehe, breite, tiefe;
	
	Box(Box alteBox )
	{
		this.breite = alteBox.breite;
		this.hoehe = alteBox.hoehe;
		this.tiefe = alteBox.tiefe;
	}
	
}

class Kapitel33_1
{
	public static void main(String[] args)
	{
		Box box1 = new Box(2,5,10);
		Box box2 = new Box(box1);

		
		System.out.println(box2.flaeche());
		System.out.println(box2.volumen());
		
	}
}

Ich erzeuge ein Box Objekt box1. Anschliessend erzeuge ich ein box2 Objekt und übergebe das box1 Objekt an den Konstruktor Box(Box alteBox )

Stimmt dies, was ich im Konstruktor Box(Box alteBox ) mache ?

Der Punkt mit den Zugriffsmethoden ist mir dann klar, nur bei dem stehe ich an

Vielen Dank im voraus
Frankster

Das kann nicht funktionieren, weil Du beim Konstruktor Box(Box alteBox) dies nicht machen kannst:
this.breite = alteBox.breite; (usw.)
Warum? Ganz einfach: breite (und die anderen) ist eine private Variable, also geht alteBox.breite nicht. Abhilfe:
1. Du deklarierst die Variable als public --> unschön und nicht objektorientiert gekapselt
2. Du implementierst die entsprechenden getter-Methoden, z.B.
Code:
public int getBreite()
{
 return breite;
}

Dann änderst Du den Konstruktor auf
Code:
	Box(Box alteBox )
	{
		this.breite = alteBox.getBreite();
		this.hoehe = alteBox.getHoehe();
		this.tiefe = alteBox.getTiefe();
	}
 
Hmm

Er kompeliert es aber und es wird auch so ausgeführt.

Und ich greif ja innherhalb der Klasse auf die Variablen zu und da ist dann das privat egal. Ich kann ja nur mit einer anderen Klasse nicht auf die Instanzvariablen zugreiffen
 
Frankster hat gesagt.:
Hi!

Code:
class Kapitel33_1
{
	public static void main(String[] args)
	{
		Box box1 = new Box(2,5,10);
		Box box2 = new Box(box1);
	}
}

Ich erzeuge ein Box Objekt box1. Anschliessend erzeuge ich ein box2 Objekt und übergebe das box1 Objekt an den Konstruktor Box(Box alteBox )

Vielen Dank im voraus
Frankster

Übrigens wäre
Box box2 = box1.clone();
interessant. ;)
 
Übrigens wäre
Box box2 = box1.clone();
interessant.
Anmerkung:
Wofür aber ein
Code:
class Box implements Cloneable{}

von Nöten wäre.

//edit ausserdem is die Methode clone() in Object protected:

sowas in der Art würde gehen:

Code:
class Box implements Cloneable{
 ...
  
     35         public Box copy(Box b){
     36 
     37                 try{
     38                         return (Box)b.clone();
     39                 }
     40                 catch(CloneNotSupportedException e){ return null; }
     41 
     42         }

...
 
Zuletzt bearbeitet:
@RedWing: Bei deiner Lösung wäre allerdings die Aufgabenstellung mit dem Konstruktor verfehlt. Es heisst ja nicht "Implementieren Sie eine Methode die eine Kopie des Objektes zurückgibt. :rtfm: :-)
 
was ist wenn du einfach nen extends machst?

Sprich du hast Box1 die hatt alle sachen also x y und das Ergebniss von x*y
dann das obj Box2 macht nen extends auf Box1 und erweitert einfach die Klasse

sprich

public class Box2 extends Box1{
}

damit haste ja praktisch schon Box1 als kopie *g* und brauchst dann nichts neues rumkopieren *G*

ausserdem
Getter und Setter sind eh vieeeel besser! :) und vorallem sauberer! :)
 
Zuletzt bearbeitet:
Zurück