9. Datenkapselung

Die Datenkapselung dient zum Verstecken von Daten und Methoden.
Dies hat mehrere Gründe; zwei wichtige sind folgende:
    - Um willkürliche Veränderungen an Daten zu verhindern und
    - Um Variablen und Funktionen nur dort existieren zu lassen, wo sie wirklich benötigt werden.

Es gibt verschiedene Stufen der Datenkapselung:

                                          public    protected    package    private
        eigene Klasse                       +          +           +          +
        Klasse im gleichen Paket            +          +           +          -
        Unterklasse im anderen Paket        +          +           -          -
        Keine Unterklasse, anders Paket     +          -           -          -

-   private:
Die Methode bzw. Variable ist nur innerhalb der eigenen Klasse verfügbar, extern ist sie unsichtbar und sie ist auch nicht vererbbar.

-   protected:
Von der eigenen Klasse und von allen abgeleiteten Klassen kann die so deklarierte Methode bzw. Variable benutzt werden, aber nicht von anderen, unabhängigen Klassen.

-    package visibility: (wird verwendet, wenn kein Schlüsselwort angegeben wird)
Die Methode bzw. Variable ist nur sichtbar in der eigenen Klasse und in allen Klassen desselben Pakets (Ein Paket wird durch "package <Paketname>" deklariert und alle folgenden Klassen gehören zu diesem Paket; siehe Beispiel).

-    public:
Mit "public" deklarierte Funktionen/Variablen können von überall aus verwendet werden.
 

    package shapes;

    public class Circle {
        protected double x, y;
        protected double r;
        private static final double MAXR = 100.0;
        private boolean check_radius(double r) { return (r <= MAXR); }

        public Circle(double x, double y, double r) {
            this.x = x; this.y = y;
            if (checkradius(r)) this.r = r;
            else this.r = MAXR;
        }
        public Circle(double r) { this(0.0, 0.0, r); }
        public Circle() { this(0.0, 0.0, 1.0); }

        public void moveto(double x, double y) { this.x = x; this.y = y; }
        public void move(double dx, double dy) { x += dx; y += dy; }
        public void setRadius(double r) { this.r = (check_radius(r))?r:MAXR; }

        public final double getX() { return x; }
        public final double getY() { return y; }
        public final double getRadius() { return r; }
    }
 

 vorherige Seite Inhalt nächste Seite