This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. # public und private Jedes Attribut einer Klasse und jede Methode kann eine der Eigenschaften `public` oder `private` erhalten. Hat sie keine davon, gilt sie standardmäßig als `public`. ## Benutzung von Attributen außerhalb der Klasse `public`: ja `private`: nein Das bedeutet, dass Attribute, die `public` sind, im konkreten Programmablauf bsp. in einer `main`-Methode, ausgelesen und geschreiben werden können - mit allen Konsequenzen, die dahinter stecken. So könnten Werte eingetragen werden, die ich als Programmierer gar nicht zulassen möchte, bsp. einen positives Dispo-Wert in einer Klasse `Konto`. \<WRAP group\> \<WRAP half column\> ``` java public class Konto { String inhaber; double guthaben; double dispo; ... } ``` \</WRAP\> \<WRAP half column\> ``` java public class Main { public static void main(String[] args) { Konto giro = new Konto(); giro.inhaber = "Homer"; giro.dispo = 1000; ... } } ``` \</WRAP\> \</WRAP\> Hier wird in der `Main`-Klasse ein Wert für `Dispo` eingetragen, der nicht zulässig ist. Wie kann man solch unerwünschtes Zugreifen auf Attribute verhindern? ## Attribut privat setzen Wenn ich selbst bestimmen möchte, wie auf bestimmte Attribute zugegriffen wird, muss ich das Attribut nach außen schützen, indem ich es auf `private` setze. Damit geht jeder Zugriff nach außen verloren. Probiere das Beispiel aus, indem das Attribut `dispo` das Schlüsselwort `private` vorangestellt wird. Du wirst sehen, dass es in der `Main` eine Fehlermeldung gibt. Schon ein Text-Editor mit Java-Extension wird sich über nicht Nicht-Sichtbarkeit beschweren. \<WRAP group\> \<WRAP half column\> ``` java public class Konto { String inhaber; double guthaben; private double dispo; ... } ``` \</WRAP\> \<WRAP half column\> ``` java public class Main { public static void main(String[] args) { Konto giro = new Konto(); giro.inhaber = "Homer"; giro.dispo = 1000; ... } } ``` \</WRAP\> \</WRAP\> ## Getter und Setter public setzen Nun wäre es ein ziemlich sinnloses Programm, wenn ich bestimmte Attribute im Programmablauf nicht verändern könnte. Als Programmierer möchte ich ja, dass Attribute ja nach Objekt unterschiedlich sein können. Ich möchte das aber eben nach **meinen eigenen Bedingungen**! Hier kommt das Konzept der sogenannten **Getter** und **Setter**-Methoden zum Tragen. Statt dass ich das Attribut `public` mache, biete ich eine **Methode** öffentlich (public) an, die das Setzen (Set) oder Auslesen (Get) von Attributen übernimmt. Was ist nun der große Unterschied zum direkten Bearbeiten? Ich kann in den **Getter** und **Setter**-Methoden meinen eigenen Bedingungen implementieren! So kann ich für das Beispiel des Kontos festlegen, dass ein Attribut `dispo` niemals positiv sein darf. Ich als Programmierer erlange somit Kontrolle über mögliche Werte von Attributen! \<WRAP group\> \<WRAP half column\> ``` java public class Konto { String inhaber; double guthaben; private double dispo; public void setDispo(int x){ if (x > 0){ this.dispo = -1 * x; } else{ this.dispo = x; } } ... } ``` \</WRAP\> \<WRAP half column\> ``` java public class Main { public static void main(String[] args) { Konto giro = new Konto(); giro.inhaber = "Homer"; giro.setDispo(1000); ... } } ``` \</WRAP\> \</WRAP\>