# 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`.
\ \
``` java
public class Konto {
String inhaber;
double guthaben;
double dispo;
...
}
```
\
\
``` java
public class Main {
public static void main(String[] args) {
Konto giro = new Konto();
giro.inhaber = "Homer";
giro.dispo = 1000;
...
}
}
```
\ \
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.
\ \
``` java
public class Konto {
String inhaber;
double guthaben;
private double dispo;
...
}
```
\
\
``` java
public class Main {
public static void main(String[] args) {
Konto giro = new Konto();
giro.inhaber = "Homer";
giro.dispo = 1000;
...
}
}
```
\ \
## 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!
\ \
``` 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;
}
}
...
}
```
\
\
``` java
public class Main {
public static void main(String[] args) {
Konto giro = new Konto();
giro.inhaber = "Homer";
giro.setDispo(1000);
...
}
}
```
\ \