Sichtbarkeit: public, private, protected
Willemers Informatik-Ecke

Wir haben etwas zu verbergen

Eine Klasse sollte nur so viel offen darlegen, wie für die Nutzer der Klasse unbedingt erforderlich. Alles was in der Klasse verborgen ist, kann später ohne Auswirkung auf andere Klassen verändert werden.

private vermeidet aufwändige Neuberechnung

Im Beispiel wird der Wochentag nur neu berechnet, wenn dies erforderlich ist.
public class Datum {
    private int tag, monat, jahr, wochentag=-1;

    public int getWochentag() {
        if (wochentag<0) {
            wochentag = berechneWochentag();
        }
        return wochentag;
    }
    ...
    public setTag(int tag) {
        this.tag = tag;
        wochentag = -1;
    }
}

Setter und Getter

Es gilt die Regel, dass Attribute niemals public sein sollten, sondern über get- und set-Methoden gelesen oder geschrieben werden. Auf diesem Wege ist es möglich, Read-Only-Attribute zu sichern.

Klassen, die nur aus Attributen, Gettern und Settern und eventuellen Konstruktoren bestehen, bezeichnet man als Java Beans oder POJO.

class MeineBean {
    private int meinAttribut;              // Attribut
    public int getMeinAttribut() {         // Getter
        return this.meinAttribut;
    }
    public void setMeinAttribut(int neu) { // Setter
        this.meinAttribut = neu;
    }
}
Eclipse unterstützt dies durch Rechtsklick in den Quelltext. Aus dem Menü wählt man Source|Create Getters and Setters. Im folgenden Dialog kann man auswählen, welche Attribute mit Gettern und Settern versehen werden sollen.
class Datum {
   private int tag;
   void setTag(int paraTag)  {
       tag = paraTag;
   }
   int getTag() {
       return tag;
   }
   ...
}

Dieses etwas umständliche Vorgehen sichert der Klasse die Kontrolle über die Attribute. Später einmal kann es erforderlich sein, zu prüfen, ob der Tag wirklich im Bereich von 1 bis 31 ist. Vielleicht will man auch sicherstellen, dass niemand den 30. Februar erfindet. Dazu müssen in den Setter-Methoden entsprechende Prüfungen eingebaut werden.

Kein Modifizierer oder protected

Wird kein private oder public vorangestellt, ist das entsprechende Element für das gesamte Package sichtbar.

Java verfügt neben public und private auch über das Schlüsselwort protected, das unter C++ nur erweiternden Klassen den Zugriff einräumt.

Allerdings verwendet Java das Schlüsselwort in einer völlig anderen Semantik. Aus der Java-Dokumentation wird klar, dass protected nicht nur dem Package einräumt, sondern darüber hinaus auch anderen Klassen anderer Packages, die die Klasse erweitern.

In der vorliegenden Form dürfte protected wenig sinnvoll sein. Aufgrund der weitverbreiteten Annahme, dass es die gleiche Bedeutung wie bei C++ hat, sollte man es nicht verwenden. In der Praxis sollten Attribute sowieso immer private sein.