JavaRush /Java-Blog /Random-DE /Zugriffsmodifikatoren. Privat, geschützt, Standard, öffen...

Zugriffsmodifikatoren. Privat, geschützt, Standard, öffentlich

Veröffentlicht in der Gruppe Random-DE
Hallo! In der heutigen Vorlesung machen wir uns mit dem Konzept der „ Zugriffsmodifikatoren “ vertraut und schauen uns Beispiele für die Arbeit mit ihnen an. Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 1Auch wenn das Wort „Lasst uns kennenlernen“ nicht ganz richtig sein wird: Die meisten davon kennen Sie bereits aus früheren Vorlesungen. Lassen Sie uns für alle Fälle unser Gedächtnis über die Hauptsache auffrischen. Zugriffsmodifikatoren sind meist Schlüsselwörter, die die Zugriffsebene auf verschiedene Teile Ihres Codes regeln. Warum „am häufigsten“? Denn einer davon ist standardmäßig gesetzt und wird nicht durch ein Schlüsselwort angegeben :) In Java gibt es insgesamt vier Zugriffsmodifikatoren. Wir listen sie in der Reihenfolge vom strengsten zum „weichsten“ auf:
  • Privat;
  • geschützt;
  • default(Paket sichtbar);
  • öffentlich
Schauen wir uns jeden von ihnen an, entscheiden, wann sie für uns nützlich sein können, und geben Beispiele :)

Modifikator privat

Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 2Private– der restriktivste Zugriffsmodifikator. Es schränkt die Sichtbarkeit von Daten und Methoden innerhalb einer einzelnen Klasse ein. Sie kennen diesen Modifikator aus der Vorlesung über Getter und Setter. Erinnern Sie sich an dieses Beispiel?
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Miau!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Wir haben es uns zuvor in einem der Artikel angesehen. Hier haben wir einen schwerwiegenden Fehler gemacht: Wir haben unsere Daten geöffnet, wodurch andere Programmierer direkten Zugriff auf die Klassenfelder hatten und deren Werte ändern konnten. Darüber hinaus wurden diese Werte ohne Prüfung zugewiesen, wodurch es in unserem Programm möglich ist, eine Katze mit einem Alter von -1000 Jahren, einem Namen „“ und einem Gewicht von 0 zu erstellen. Um dieses Problem zu lösen, haben wir Verwendete Getter und Setter sowie eingeschränkten Zugriff auf die Daten mithilfe eines Modifikators private.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Miau!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // Überprüfung des Eingabeparameters
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // Überprüfung des Eingabeparameters
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // Überprüfung des Eingabeparameters
       this.weight = weight;
   }
}
Tatsächlich ist die Beschränkung des Zugriffs auf Felder und die Implementierung von Getter-Setter das häufigste Anwendungsbeispiel privatein der Praxis. Das heißt, die Implementierung der Kapselung in einem Programm ist der Hauptzweck dieses Modifikators. Das gilt übrigens nicht nur für Felder. Stellen Sie sich vor, dass es in Ihrem Programm eine Methode gibt, die eine SEHR komplexe Funktionalität implementiert. Um dies als Beispiel zu nennen: Nehmen wir an, Ihre Methode readDataFromCollider()nimmt eine Adresse mit Daten als Eingabe, liest Daten vom Large Hadron Collider im Byte-Format, wandelt diese Daten in Text um, schreibt sie in eine Datei und druckt sie aus. Sogar die Beschreibung der Methode sieht gruselig aus, ganz zu schweigen vom Code :) Um die Lesbarkeit des Codes zu verbessern, wäre es gut, komplexe Methodenlogik nicht an einer Stelle zu schreiben, sondern im Gegenteil die Funktionalität in separate Methoden aufzuteilen . Die Methode ist beispielsweise readByteData()dafür verantwortlich, Daten zu lesen, convertBytesToSymbols()die vom Collider gelesenen Daten in Text umzuwandeln, saveToFile()den resultierenden Text in einer Datei zu speichern und printColliderData()unsere Datendatei zu drucken. Die Methode readDataFromCollider()wäre am Ende viel einfacher:
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // liest Daten in Bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Bytes in Zeichen umwandeln
   }

   public File saveToFile(String[] colliderData) {

       // die gelesenen Daten in einer Datei speichern
   }

   public void printColliderData(File fileWithColliderData) {

       // Daten aus Datei drucken
   }
}
Wie Sie sich aus der Vorlesung über Schnittstellen erinnern, erhält der Benutzer jedoch nur Zugriff auf die endgültige Schnittstelle. Und unsere 4 Methoden gehören nicht dazu. Sie sind Hilfsfunktionen : Wir haben sie erstellt, um die Lesbarkeit des Codes zu verbessern und zu vermeiden, dass vier verschiedene Aufgaben in einer Methode zusammengepfercht werden. Es ist nicht erforderlich, dem Benutzer Zugriff auf diese Methoden zu gewähren. Wenn ein Benutzer beim Arbeiten mit einem Collider Zugriff auf die Methode hat convertBytesToSymbols(), wird er höchstwahrscheinlich einfach nicht verstehen, was diese Methode ist und warum sie benötigt wird. Welche Bytes werden konvertiert? Wo kommst du her? Warum sie in Text umwandeln? Die in dieser Methode ausgeführte Logik ist nicht Teil der Benutzeroberfläche. Nur die Methode readDataFromCollider()ist Teil der Schnittstelle. Was tun mit diesen vier „internen“ Methoden? Rechts! Beschränken Sie den Zugriff darauf mit einem Modifikator private. Auf diese Weise können sie ihre Arbeit problemlos innerhalb der Klasse erledigen und verwirren den Benutzer nicht, der nicht die Logik jedes einzelnen von ihnen einzeln benötigt.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // liest Daten in Bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Bytes in Zeichen umwandeln
   }

   private File saveToFile(String[] colliderData) {
       // die gelesenen Daten in einer Datei speichern
   }

   private void printColliderData(File fileWithColliderData) {
       // Daten aus Datei drucken
   }
}

Modifikator geschützt

Der nächst restriktivste Zugriffsmodifikator ist protected. Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 3 Mit dem Zugriffsmodifikator gekennzeichnete Felder und Methoden protectedwerden angezeigt:
  • innerhalb aller Klassen, die im selben Paket wie unsere sind;
  • innerhalb aller Nachfolgeklassen unserer Klasse.
Es ist sofort schwer vorstellbar, wann dies erforderlich sein könnte. Seien Sie nicht überrascht: protectedEs gibt viel weniger Anwendungsfälle als private, und diese sind spezifisch. Stellen Sie sich vor, wir hätten eine abstrakte Klasse AbstractSecretAgent, die einen Geheimagenten eines Geheimdienstes bezeichnet, sowie ein Paket top_secret, das diese Klasse und ihre Nachkommen enthält. Konkrete Klassen – FBISecretAgent, MI6SecretAgentusw. MossadSecretAgent– werden davon geerbt. Innerhalb der abstrakten Klasse wollen wir einen Agentenzähler implementieren. Wenn irgendwo im Programm ein neues Agentenobjekt erstellt wird, wird es vergrößert.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Aber unsere Agenten sind geheim! Das bedeutet, dass nur sie und niemand sonst von ihrer Nummer erfahren sollte. protectedWir können dem Feld ganz einfach einen Modifikator hinzufügen agentCount, und dann können entweder Objekte anderer Geheimagentenklassen oder die Klassen, die sich in unserem „geheimen“ Paket befinden, seinen Wert erhalten top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Für solche spezifischen Aufgaben wird ein Modifikator benötigt protected:)

Paketsichtbarkeitsmodifikator

Als nächstes steht auf unserer Liste der Modifikator defaultoder, wie er auch genannt wird package visible. Es wird nicht durch ein Schlüsselwort angegeben, da es in Java standardmäßig für alle Felder und Methoden festgelegt ist. Wenn Sie in Ihren Code schreiben:
int x = 10;
... die Variable xwird denselben package visibleZugriff haben. Wenn eine Methode (oder Variable) mit keinem Modifikator markiert ist, gilt sie als mit dem „Standardmodifikator“ markiert. Variablen oder Methoden mit einem solchen Modifikator (also überhaupt ohne) sind für alle Klassen des Pakets sichtbar, in dem sie deklariert sind. Und nur für sie. Seine Verwendungsmöglichkeiten sind begrenzt, genau wie der Modifikator protected. Am häufigsten defaultwird -access in einem Paket verwendet, in dem es einige Dienstprogrammklassen gibt, die nicht die Funktionalität aller anderen Klassen in diesem Paket implementieren. Geben wir ein Beispiel. Stellen Sie sich vor, wir hätten ein „ Dienstleistungs “-Paket. Darin befinden sich verschiedene Klassen, die mit der Datenbank arbeiten. Beispielsweise gibt es eine Klasse UserService, die Benutzerdaten aus einer Datenbank liest, eine Klasse CarService, die Daten über Autos aus derselben Datenbank liest, und andere Klassen, von denen jede mit ihrem eigenen Objekttyp arbeitet und Daten über sie aus der Datenbank liest.
package services;

public class UserService {
}

package services;

public class CarService {
}
Es kann jedoch leicht vorkommen, dass die Daten in der Datenbank in einem Format vorliegen, wir sie jedoch in einem anderen benötigen. Stellen Sie sich vor, dass das Geburtsdatum des Benutzers in der Datenbank im Format TIMESTAMP WITH TIME ZONE... gespeichert ist.
2014-04-04 20:32:59.390583+02
...wir brauchen stattdessen das einfachste Objekt - java.util.Date. Zu diesem Zweck können wir innerhalb des Pakets serviceseine spezielle Klasse erstellen Mapper. Er wird für die Konvertierung der Daten aus der Datenbank in die uns bekannten Java-Objekte verantwortlich sein. Eine einfache Hilfsklasse. Normalerweise erstellen wir alle Klassen als public class ClassName, aber das ist nicht notwendig. Wir können unsere Hilfsklasse einfach als deklarieren class Mapper. In diesem Fall erfüllt es weiterhin seine Aufgabe, ist aber für niemanden außerhalb des Pakets sichtbar services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Und das ist tatsächlich die richtige Logik: Warum sollte jemand außerhalb des Pakets eine Hilfsklasse sehen, die nur mit Klassen desselben Pakets funktioniert?

öffentlicher Modifikator

Und als letztes auf der Liste, aber nicht zuletzt: der Modifikator public! Sie trafen ihn am ersten Tag Ihres Studiums bei JavaRush, dem Start von public static void main(String[] args). Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 4 Nachdem Sie nun die Vorlesungen über Schnittstellen studiert haben, ist Ihnen der Zweck klar :) Schließlich publicwurde es erstellt, um den Benutzern etwas zu bieten. Zum Beispiel die Schnittstelle Ihres Programms. Nehmen wir an, Sie haben ein Übersetzerprogramm geschrieben, das russische Texte ins Englische übersetzen kann. Sie haben eine Methode erstellt translate(String textInRussian), in der die notwendige Logik implementiert ist. Sie haben diese Methode mit dem Wort markiert publicund sie wird nun Teil der Schnittstelle:
public class Translator {

   public String translate(String textInRussian) {

       // übersetzt Text aus dem Russischen ins Englische
   }
}
Sie können einen Aufruf dieser Methode mit der Schaltfläche „Übersetzen“ auf dem Programmbildschirm verknüpfen – und fertig! Jeder kann es benutzen. Mit dem Modifikator gekennzeichnete Teile des Codes publicsind für den Endbenutzer bestimmt. Um ein Beispiel aus dem Leben zu nennen: privateDies sind alle Prozesse, die im Inneren des Fernsehers ablaufen, wenn er in Betrieb ist, und publicdas sind die Tasten auf der Fernbedienung des Fernsehers, mit denen der Benutzer ihn steuern kann. Gleichzeitig muss er nicht wissen, wie der Fernseher funktioniert und wie er funktioniert. Die Fernbedienung besteht aus einer Reihe von publicMethoden: on(), off(), nextChannel(), previousChannel(), increaseVolume()usw.decreaseVolume()
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION