Zugriff auf ein erstelltes Objekt von einer Klasse

kingmar

Grünschnabel
Hallo

ich habe eine Klasse Buch. In dieser sind die Setter und Getter Methoden integriert.

In einer weiteren Klasse habe ich über

Buch buch = new Buch ();

ein neues Objekt erstellt und mittels

buch.setName("Buch1");

einen Wert zugewiesen.

Jetzt möchte ich von einer dritten Klasse auf diesen Wert zugreifen.

buch.getName();

Wie genau mache ich das, da in dieser Klasse das BUCH ja nicht bekannt ist.
 
Hi,

eigentlich hast du dir die Frage ja schon selbst beantwortet oder...?
Nimm einen Getter.

Bzw. genauer:

Wenn das Buch in deiner 2. Klasse, in der es instanziert wird, als Klassenvariable gespeichert wird (wie die Attribute im Buch) -> Getter

Wenn das Buch aber nur in einer Methode instanziert und nachher wieder weggeschmissen wird, du es aber noch in einer 3. Klasse brauchst -> 3. Klasse ruft Methode aus 2. Klasse auf, die macht irgendwas mit dem Buch und gibt zurück.

Und dann kannst du ja auf deine Buch-Variable mit getName() zugreifen.


Gruß
Daniel
 
Wie mache ich das Buch in der 3. Klasse denn genau bekannt? Wenn ich mit Buch buch1 = new Buch(); arbeite wird ja einfach ein neues Objekt erzeugt und das bringt mir nichts ;( Wie sieht so eine Methode in Klasse 3 aus, die eine Methode aus Klasse 3 aufruft...?
 
Hi,

ein kleines Beispiel:

Klasse Buch
Java:
public class Buch
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

Deine 2. Klasse (ich nenn sie mal KlasseInnen):
Java:
public class KlasseInnen
{
    /*
     *  Entweder als Klassenvariable mit Getter
     */
    private static Buch buch; // <- Muss irgendwo zugewiesen werden!
  
    public static Buch getBuch()
    {
        return buch;
    }
  
  
  
    /*
     *  Oder in einer Methode, falls du das Buch-Objekt sonst nicht extra in der Klasse speichern willst
     */
    public static Buch methodeDieIrgendwasMacht()
    {
        Buch buch = new Buch();
      
        // Irgendwas mit dem Buch machen
      
        return buch; // <- Rückgabe buch
    }
}

Deine 3. Klasse (ich nenn sie mal KlasseAussen):
Java:
public class KlasseAussen
{
    public static void machtAuchIrgendwas()
    {
        // Entweder Getter aus Klasse 2
        Buch buch = KlasseInnen.getBuch();
      
        // Oder Methode die irgendwas macht...eigentlich das gleiche, da der Getter ja auch was macht -> das Buch zurückgeben
        Buch buch = KlasseInnen.methodeDieIrgendwasMacht();
    }
}



Ich glaube dein eigentliches Problem war von Anfang an, dass du nicht weißt, wie du Klassen-Methoden aufrufen kannst. Der kleine aber feine Unterschied ist das Schlüsselwort static. Das hat zur Folge, dass du die Methode auch aufrufen kannst, wenn du kein Objekt aus der Klasse bildest (eben über {Klassenname}.{Methodenname}).
Das geht mit Variablen übrigens auch (man redet dann von Instanzvariablen oder eben mit static von Klassenvariablen).

Stell es dir einfach mal so vor:
Variablen und Methoden ohne static sind immer Teil eines Objektes. D.h. wenn du 2 Bücher machst, können diese unterschiedliche Namen haben usw.
Wenn du dann buch1.setName() machst, wird die Methode für buch1 aufgerufen, d.h. der Name von buch1 wird geändert. Nicht der von buch2.

Bei statischen Variablen und Methoden sieht das ein bisschen anders aus. Die sind Teil der Klasse, nicht des Objekts. Wenn du also eine statische Variable in buch1 änderst, ist der Wert auch in jedem anderen Buch geändert. Weil der Wert eben in der Klasse gespeichert ist, nicht im Objekt.
Bei Methoden ist das genauso. Und da diese in der Klasse sind, musst du sie auch mit dem Klassennamen aufrufen (nochmal: {Klassenname}.{Methodenname}).

Das ist natürlich alles stark vereinfacht dargestellt, aber hilft dir hoffentlich, eine kleine Vorstellung zu bekommen, wie es funktionert.

Gruß
Daniel
 
Stop Daniel hat das zwar schön beschrieben aber eine Sache nicht erwähnt:

man muss wissen wann das Schlüsselwort static angebracht ist und wann nicht.
Dafür muss man etwas tiefer gehen:

Wenn du eine Statische Variable definierst, wird im Hintergrund diese Variable fest verdrahtet.
Das Heißt: Es wird in in den Heap des Arbeitsspeicher geschrieben und "lebt" solange wie das Programm lauft.
Das ist deshalb so: Da du Theoretisch immer (aus dem Ganzen Programm) auf diese Variable zugreifen kannst.
Und somit kann der GC (googles mal) nie diese Variable vernichten.
Somit sollte man Statische Variabeln immer bedacht einsetzten und nur dann, wenn es wirklich im gesamten Programm oft benötigt wird oder ein kern Bestandteil des Projektes ist.

Nun noch ein Kleines Beispiel ohne static ist ein bissle umfangreicher geworden.
Aber naja

Java:
public class Starter {

 
 
   /**
    *
    * Hier statet dein Programm
    * @param args
    */
   public static void main(String[] args) {
     Buecherei buecherei = new Buecherei();
     buecherei.addNeuesBuch(new Buch("Herr der Ringe 0"));
     buecherei.addNeuesBuch(new Buch("Herr der Ringe 1"));
     buecherei.addNeuesBuch(new Buch("Herr der Ringe 2"));
     buecherei.addNeuesBuch(new Buch("Herr der Ringe 4"));
     Kunde ralf = new Kunde("Ralf");
     Kunde joe = new Kunde("Joe");
     Kunde peter = new Kunde("Peter");
   
     buecherei.verleiheBuch("Herr der Ringe 0", ralf);
     buecherei.verleiheBuch("Herr der Ringe 0", joe); 
     buecherei.verleiheBuch("Herr der Ringe 1", joe); 
     buecherei.verleiheBuch("Herr der Ringe 2", ralf);
     buecherei.verleiheBuch("Herr der Ringe 4", peter);
     ralf.zeigeAusgeliehneBuecher();
     joe.zeigeAusgeliehneBuecher();
     peter.zeigeAusgeliehneBuecher();
     buecherei.gebeBuchZurueck(peter.getBuchList().get(0));
     peter.zeigeAusgeliehneBuecher();
   }
 

}
Java:
public class Buch {

   private String name,inhalt;
   private boolean schonVerliehen = false;
   private Kunde kunde;
 
   public Buch(String name){
     setName(name);
   }
 
   public Buch(String name, String inhalt){
     this(name);
     setInhalt(inhalt);
   }
 
   public String getName() {
     return name;
   }

   public void setName(String name) {
     this.name = name;
   }

   public String getInhalt() {
     return inhalt;
   }

   public void setInhalt(String inhalt) {
     this.inhalt = inhalt;
   }

   public boolean isSchonVerliehen() {
     return schonVerliehen;
   }

   public void setSchonVerliehen(boolean schonVerliehen) {
     this.schonVerliehen = schonVerliehen;
   }

   public Kunde getKunde() {
     return kunde;
   }

   public void setKunde(Kunde kunde) {
     if (kunde == null){
       setSchonVerliehen(false);
     }else{
       setSchonVerliehen(true);
     }
     this.kunde = kunde;
   }
 
   public String toString(){
     return getName();
   }
 
}
Java:
public class Buecherei {

   HashMap<String, Buch> buecher = new HashMap<String, Buch>();
 
   public Buch verleiheBuch(String buchtitle, Kunde kunde){
     Buch b = buecher.get(buchtitle);
     if (b != null){
       if (b.isSchonVerliehen()){
         System.out.println("Buch:"+b+" ist schon Verliehen an "+ b.getKunde());
       }else{
       
         System.out.println(kunde+" leiht "+b);
         b.setKunde(kunde);
         kunde.setBuch(b);
       }
       
     }else{
       System.out.println("Buch haben wir nicht");
     }
     return b;
   
   
   }
 
   public void gebeBuchZurueck(Buch buch){
     System.out.println(buch+" wird von "+buch.getKunde()+" zurueckgegeben");
     buch.getKunde().removeBuch(buch);
     buch.setKunde(null);
   
   }
 
   public void addNeuesBuch(Buch buch){
     buecher.put(buch.getName(), buch);
   }
 
 
}
Java:
public class Kunde {

 
   private String name;
   private List<Buch> gelieheneBuecher = new ArrayList<Buch>();
 
   public Kunde(String name){
     setName(name);
   }
 
   public void setBuch(Buch buch){
     gelieheneBuecher.add(buch);
   }
 
   public void removeBuch(Buch buch){
     gelieheneBuecher.remove(buch);
   }
 
   public List<Buch> getBuchList(){
     return gelieheneBuecher;
   }
 

 
   public void zeigeAusgeliehneBuecher(){
     System.out.println("Geliehene Buecher von "+getName()+": ");
     for (Buch einBuch : gelieheneBuecher){
       System.out.println("\t"+einBuch.getName());
     }
   }

   public String getName() {
     return name;
   }

   public void setName(String name) {
     this.name = name;
   }
 
   public String toString(){
     return getName();
   
   }
}
 

Neue Beiträge

Zurück