# Get und Set



## David2456 (5. Jan 2016)

Hallo
ich habe bei folgender Aufgabe ein Problem. Undzwar wie ich get und set richtig benutze. Noch habe ich nichts mit get und set programmiert daher weiß ich es nicht so genau. Die Klassen habe ich schon implementiert und ich könnte jetzt auch die get und set Befehle umschreiben das die Klassen Attribute dem Wert zugewiesen werden, aber das ist ja nicht der Sinn der Aufgabe.
Danke schonmal


----------



## Bitfehler (5. Jan 2016)

Unbekannt.JPG ist die Aufgabe und Unbenannt2.JPG die gewünschte Ausgabe?

Dann zeig doch einfach mal was du bisher gemacht hast.


----------



## David2456 (5. Jan 2016)

Naja ich habe die beiden Klassen implementiert.

```
class Person {
            String Name;
            String LastName;
            String Address;
        }
       
        class Postcard {
            String From;
            String To;
            String Text;
        }
```

Und wollte grade gucken ob es soweit funktioniert. Dann habe ich gesehen das ich get und set irgendwie benutzen muss :/


----------



## Bitfehler (5. Jan 2016)

Die Klasse Person hat drei Attribute (name, lastname und address). Wenn du nun ein konkretes Objekt dieser Klasse erzeugen willst, müssen diese drei Attribute ja Werte annehmen. Die Klasse Person gibt erstmal an, was eine Person ausmacht ohne es mit Werten zu belegen. Wenn du von der Klasse mit Hilfe von new Persion() eine Instanz erstellst hast, kannst du die Attribute mit Werten belegen (beispielsweise mit Jan,Meier, Welt).
Dieses Setzen der Werte kann man u.a. mit Settern machen. Das heißt deine Klasse Person braucht eine Methode _setName(String name)_, diese Methode weißt dem Attribut dem übergebenen Wert zu.
Die Getter geben dann wieder etwas zurück.

Das heißt du müsstest nun erstmal sechs Methoden schreiben.

Nachtrag: 
Die Attribute From und To bei der Postkarte sind nicht vom Typ String, das solltest du noch verbessern.


----------



## David2456 (8. Jan 2016)

Ok verstanden, aber wie sieht denn eine von den Methoden z.B setName aus? Sie soll ja das was nach dem Methodenaufruf in der Klammer steht in das Attribut Name bei Person marco setzen


----------



## Bitfehler (8. Jan 2016)

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

Dann kannst du später folgendes tun:

```
Person adam = new Person();
adam.setName("Adam");
```


----------



## Jardcore (8. Jan 2016)

David du solltest dir vielleicht nochmal den *Vor dem ersten Posten bitte lesen* Beitrag durchlesen, dort ist auch eine Verlinkung zu den *FAQ http://www.java-forum.org/thema/uebersicht-der-faq.8431/*wo genau solche Sachen schon erklärt sind.


----------



## David2456 (8. Jan 2016)

@Bitfehler Ich verstehe dein Beispiel nicht so wirklich. Wenn ich das auf mein Programm anwende kriege ich immernoch Fehler. Cannot find Symbol   bei this.Name

```
public class MailOffice {
class Person {
            String Name;
            String LastName;
            String Address;
        }

public static void main(String[] args) {
         
            Person marco = new Person();
            marco.setName("Marco");
          
            Out.print(marco);
}
      
        public void setName(String Name) {
        this.Name = Name;
        }
      
      
}
```


----------



## kneitzel (8. Jan 2016)

Du hast eine Klasse in der anderen? Deine Klasse MailOffice hat keine Instanzvariable Name.


----------



## David2456 (9. Jan 2016)

Ups. Danke. Das löst aber leider noch nicht mein Problem mit dem cannot find Symbol  bei dem this.Name


----------



## kneitzel (9. Jan 2016)

Dann gib den veränderten Code. Und this.Name existiert nur in der Klasse, in der Du die Instanzvariable Name definiert hast.

Sauber arbeiten ist das a und o - Dinge zu vermengen ist ein absolut schlimmer Fehler, also trenne die Dinge. Und dann sollte Dir auffallen, dass setName nicht zu MailOffice sondern zu Person gehört.

Konrad


----------



## knilch (9. Jan 2016)

> David du solltest dir vielleicht nochmal den Vor dem ersten Posten bitte lesen Beitrag durchlesen, dort ist auch eine Verlinkung zu den FAQ http://www.java-forum.org/thema/uebersicht-der-faq.8431/wo genau solche Sachen schon erklärt sind.


Jardcore hat es schon gepostet.... Dein Problem siehst du, wenn du die GRUNDLAGEN mal richtig anschaust....
Hier mal ein beispiel:
Person.java:

```
public class Person {
    private String name;
    private String lastName;
    private String address;
   
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
   
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
   
    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }
   
    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
   
    /**
     * @return the address
     */
    public String getAddress() {
        return address;
    }
   
    /**
     * @param address the address to set
     */
    public void setAddress(String address) {
        this.address = address;
    }
   
    @Override
    public String toString() {
        return lastName + " " + name + " " + address;
    }
   
}
```
MailOffice.java:

```
public class MailOffice {
    public static void main(String[] args) {

        Person person1 = new Person();
        person1.setName("Marco");
        person1.setLastName("Meier");
        person1.setAddress("Musterstrasse 1, 1234 Musterhausen");
       
        Person person2 = new Person();
        person2.setName("Peter");
        person2.setLastName("Meier");
        person2.setAddress("Musterstrasse 2, 4321 Musterhausen");

        System.out.println(person1);
        System.out.println(person2);
    }
}
```


----------



## David2456 (11. Jan 2016)

Dankeschön. Hab jetzt die Person Klasse fertig, aber bei der Postcard Klasse habe ich noch Probleme. Wie oben schon erwähnt ist From und To vom falschen Datentyp. Wie werden denn Datentypen einer Klasse genannt. Versuche momentan die Werte von marco in der Postcard Klasse zu benutzen

```
public class MailOffice {
 
        public static void main(String[] args) {
       
            Person marco = new Person();
            marco.setName("Marco");
            marco.setLastName("Bungart");
            marco.setAddress("Wilhelmsh\u00f6her Allee 71-73, R. 2309, 34121 Kassel");
            Out.print(marco);
        
            Person niko = new Person();
            niko.setName("Niko");
            niko.setLastName("Luke");
            niko.setAddress("Wilhelmshöher Allee 71-73, R. 2310, 34121 Kassel");
        
            Person jonas = new Person();
            jonas.setName("Jonas");
            jonas.setLastName("Posner");
            jonas.setAddress(marco.getAddress());
        
            Postcard card1 = new Postcard();
            card1.setFrom(niko);
            card1.setTo(marco);
            card1.setText("Hallo Marco, ich wuensche dir ein schoenes Fest!");
            Out.print(card1);
        
          //  Postcard card2 = new Postcard();
         //   card2.setFrom(jonas);
          //  card2.setTo(niko);
         //   card2.setText("Hi Niko, komm gut ins neue Jahr!");
          //  Out.print(card2);

        }
  
    
}
```


```
public class Person {
    private String Name;
    private String LastName;
    private String Address;


    public String getName() {
        return Name;
    }
 
    public void setName(String Name) {
        this.Name = Name;
    }
  
    public String getLastName() {
        return LastName;
    }
 
    public void setLastName(String LastName) {
        this.LastName = LastName;
    }
   
    public String getAddress() {
        return Address;
    }
   
    public void setAddress(String Address) {
        this.Address = Address;
    }
  
    public String toString() {
        return Name + " " + LastName + " \n" +  Address + "\n-----------------------------------------------------------";
    }

}
```


```
public class Postcard {
    private Person From;
    private Person To;
    private String Text;


    public Person getFrom(Person marco) {
        return marco;
    }
 
    public void setFrom(Person From, Person marco) {
        this.From = marco;
    }
  
    public Person getTo(Person niko) {
        return niko;
    }
 
    public void setTo(Person To, Person niko) {
        this.To = niko;
    }
  
    public String getText() {
        return Text;
    }
  
    public void setText(String Text) {
        this.Text = Text;
    }
  
    public String toString() {
        return "Postcard\n" + From +":" + " " + To+":" + " \n" +  Text":" +"\n-----------------------------------------------------------"+"\n-----------------------------------------------------------";
    }

}
```

Hab es einfach mal mit dem Klassennamen versucht und ein bisschen rumprobiert komme jetzt aber nicht mehr weiter


----------



## David2456 (11. Jan 2016)

edit Habe Postcard denke ich fast richtig hinbekommen nur ist die Ausgabe noch etwas anderst als gewünscht

```
public class Postcard {
    private Person From;
    private Person To;
    private String Text;
 
  
    public Person getFrom() {
        return From;
    }
   
    public void setFrom(Person From) {
        this.From = From;
    }
    
    public Person getTo() {
        return To;
    }
   
    public void setTo(Person To) {
        this.To = To;
    }
    
    public String getText() {
        return Text;
    }
    
    public void setText(String Text) {
        this.Text = Text;
    }
    
    public String toString() {
        return "\nPostcard\n" + From +"From: "  + To+"To: " + " \n" +  Text+"Text: " +"\n-----------------------------------------------------------"+"\n-----------------------------------------------------------" ;
    }
 
}
```

edit hab nur etwas bei der Ausgabe verdeht


----------



## Joose (11. Jan 2016)

EDIT: Hinfällig, Lösung hast du ja schon selbstständig gefunden 



David2456 hat gesagt.:


> .... aber bei der Postcard Klasse habe ich noch Probleme. Wie oben schon erwähnt ist From und To vom falschen Datentyp. Wie werden denn Datentypen einer Klasse genannt.



Das Problem hat nichts mit den Datentypen zu tun, diese stimmen schon.
Das Problem liegt bei den Parametern bzw. die Anzahl der Parameter.



```
public static void main(String[] args) {
   Person marco = new Person();
  marco.setName("Marco");
   marco.setLastName("Bungart");
   marco.setAddress("Wilhelmsh\u00f6her Allee 71-73, R. 2309, 34121 Kassel");
   Out.print(marco);
  
   Person niko = new Person();
   niko.setName("Niko");
   niko.setLastName("Luke");
   niko.setAddress("Wilhelmshöher Allee 71-73, R. 2310, 34121 Kassel");

   Postcard card1 = new Postcard();
   card1.setFrom(niko);
   card1.setTo(marco);
   card1.setText("Hallo Marco, ich wuensche dir ein schoenes Fest!");
   Out.print(card1);
}
```

In diesem Code übergibst du korrekt jeweils passend ein Objekt vom Typ Person.
Aber laut deinem Code der Klasse Postcard:

```
public class Postcard {
  private Person To;
   .....
  
  public void setFrom(Person From, Person marco) {
  this.From = marco;
  }
  public void setTo(Person To, Person niko) {
  this.To = niko;
  }
   ....
}
```

Erwarten deine Methoden "setFrom" und "setTo" jeweils 2 Objekte vom Typ Person. -> richtig wäre jeweils 1 Objekt!

Dein Verständnisproblem ist: Das du nicht weißt warum deine Methode plötzlich dein Objekt "marco" oder "niko" kennen sollte.
Ganz einfach die Methoden erwarten Parameter, diese Parameter haben einen Namen und durch diesen Namen können die jeweiligen Objekte/Wert angesprochen werden.
Hier die Beispiellösung:

```
public static void main(String[] args) {
   Person niko = new Person();
   niko.setName("Niko");

   Postcard card1 = new Postcard();
   card1.setFrom(niko);
}

public class Postcard {
  private Person from;
   private Person to;
   .....
  
  public void setFrom(Person from) {
  this.from = from;
  }
  
   public void setTo(Person toPerson) {
     this.to = toPerson;
   }
   ....
}
```

Beim "setTo" habe ich den Namen des Parameters abgeändert damit es für dich ersichtlicher ist was Instanzvariable und was Parameter ist.
Hinweis: Parameternamen und Instanzvariablen immer in "lowerCamelCase" schreiben! UpperCamelCase sollte nur für Klassennamen verwendet werden.


----------



## David2456 (11. Jan 2016)

Vielen Dank für eure Antworten. Bin dadurch auf die Lösung gekommen


----------

