Access Modifiers in Java

Zugriffsmodifikatoren in Java

1. Überblick

In diesem Lernprogramm werden Zugriffsmodifikatoren in Java behandelt, mit denen die Zugriffsebene auf Klassen, Variablen, Methoden und Konstruktoren festgelegt wird.

Simply put, there are four access modifiers:public,private,protected unddefault (kein Schlüsselwort).

Bevor wir beginnen, stellen wir fest, dass eine Klasse der obersten Ebene nur die Zugriffsmodifikatorenpublic oderdefaultverwenden kann. Auf der Mitgliedsebene können wir alle vier verwenden.

2. Standard

Wenn wir kein Schlüsselwort explizit verwenden, legt Java den Zugriff vondefaultauf eine bestimmte Klasse, Methode oder Eigenschaft fest. Der Standardzugriffsmodifikator wird auchpackage-private genannt. Dies bedeutet, dassall members are visible within the same package, aber von anderen Paketen aus nicht zugänglich sind:

package com.example.accessmodifiers;

public class SuperPublic {
    static void defaultMethod() {
        ...
    }
}

AufdefaultMethod() kann in einer anderen Klasse desselben Pakets zugegriffen werden:

package com.example.accessmodifiers;

public class Public {
    public Public() {
        SuperPublic.defaultMethod(); // Available in the same package.
    }
}

Es ist jedoch nicht in anderen Paketen verfügbar.

3. Öffentlichkeit

Wenn wir das Schlüsselwortpublic zu einer Klasse, Methode oder Eigenschaft hinzufügen, dannwe’re making it available to the whole world, d.h. Alle anderen Klassen in allen Paketen können es verwenden. Dies ist der am wenigsten einschränkende Zugriffsmodifikator:

package com.example.accessmodifiers;

public class SuperPublic {
    public static void publicMethod() {
        ...
    }
}

publicMethod() ist in einem anderen Paket verfügbar:

package com.example.accessmodifiers.another;

import com.example.accessmodifiers.SuperPublic;

public class AnotherPublic {
    public AnotherPublic() {
        SuperPublic.publicMethod(); // Available everywhere. Let's note different package.
    }
}

4. Privat

Jede Methode, Eigenschaft oder jeder Konstruktor mit dem Schlüsselwortprivateprivate. Dies ist der restriktivste Zugriffsmodifikator und der Kern des Kapselungskonzepts. Alle Daten werden vor der Außenwelt versteckt:

package com.example.accessmodifiers;

public class SuperPublic {
    static private void privateMethod() {
        ...
    }

     private void anotherPrivateMethod() {
         privateMethod(); // available in the same class only.
    }
}

5. Geschützt

Zwischen den Zugriffsebenenpublic undprivatebefindet sich der Zugriffsmodifikatorprotected.

Wenn wir eine Methode, eine Eigenschaft oder einen Konstruktor mit dem Schlüsselwortprotecteddeklarieren, können wir übersame package (as with package-private access level) and in addition from all subclasses of its classauf das Mitglied zugreifen, auch wenn sie in anderen Paketen liegen:

package com.example.accessmodifiers;

public class SuperPublic {
    static protected void protectedMethod() {
        ...
    }
}

protectedMethod() ist in Unterklassen verfügbar (unabhängig vom Paket):

package com.example.accessmodifiers.another;

import com.example.accessmodifiers.SuperPublic;

public class AnotherSubClass extends SuperPublic {
    public AnotherSubClass() {
        SuperPublic.protectedMethod(); // Available in subclass. Let's note different package.
    }
}

6. Vergleich

In der folgenden Tabelle sind die verfügbaren Zugriffsmodifikatoren zusammengefasst. Wir können sehen, dass eine Klasse unabhängig von den verwendeten Zugriffsmodifikatoren immer Zugriff auf ihre Mitglieder hat:

Modifikator

Klasse

Paket

Unterklasse

Welt

public

Y

Y

Y

Y

protected

Y

Y

Y

N

default

Y

Y

N

N

private

Y

N

N

N

7. Fazit

In diesem kurzen Artikel haben wir uns mit Zugriffsmodifikatoren in Java befasst.

Es wird empfohlen, die für ein bestimmtes Mitglied möglichst restriktive Zugriffsebene zu verwenden, um Missbrauch zu verhindern. Wir sollten immer den Zugriffsmodifikatorprivateverwenden, es sei denn, es gibt einen guten Grund, dies nicht zu tun.

Die Zugriffsebene vonPublicollte nur verwendet werden, wenn ein Mitglied Teil einer API ist.

Wie immer sind die Codebeispieleover on Github verfügbar.