Hallo! Wir widmen die heutige Lektion der Kapselung in Java und beginnen mit Beispielen von Anfang an:) Hier haben Sie einen gewöhnlichen Getränkeautomaten . Ich habe eine Frage an Sie: Wie funktioniert es? Versuchen Sie eine detaillierte Antwort zu geben: Wo kommt die Limonade her? Wie wird die Innentemperatur aufrechterhalten? Wo wird das Eis gelagert? Woher weiß die Maschine, welchen Sirup sie hinzufügen muss? Auf diese Fragen haben Sie wahrscheinlich keine Antworten. Okay, vielleicht nutzt nicht jeder diese Maschinen. Sie sind derzeit nicht so beliebt. Versuchen wir es mit einem anderen Beispiel. Etwas, das Sie auf jeden Fall jeden Tag viele Male verwenden. Oh, ich habe eine Idee! Erzähl mir, wie die Google-Suchmaschine funktioniertfunktioniert. Wie genau sucht es nach Informationen zu den von Ihnen eingegebenen Wörtern? Warum stehen diese Ergebnisse ganz oben und andere nicht? Auch wenn Sie Google jeden Tag nutzen, wissen Sie es wahrscheinlich nicht. Aber das spielt keine Rolle. Schließlich ist es nichts, was Sie wissen müssen. Sie können eine Suchmaschine nutzen, ohne darüber nachzudenken, wie sie genau funktioniert. Sie können Limonade an einem Automaten kaufen, ohne zu wissen, wie dieser aufgebaut ist. Sie können ein Auto fahren, ohne sich mit der Funktionsweise des Verbrennungsmotors auseinanderzusetzen und ohne Physikkenntnisse in der Oberstufe zu haben. Dies alles ist dank eines der Hauptprinzipien der objektorientierten Programmierung möglich: der Kapselung. Beim Lesen verschiedener Artikel zu diesem Thema sind Sie bestimmt auf zwei weit verbreitete Programmierkonzepte gestoßen: Kapselung und Informationsverbergung. Tatsächlich verstehen unterschiedliche Menschen das Wort „ „Kapselung“ hat verschiedene Bedeutungen. Wir entschlüsseln beide Begriffe, damit Sie sie vollständig verstehen. In der Programmierung ist die ursprüngliche Bedeutung vonBei der Kapselung wurden Daten und Methoden zum Arbeiten mit diesen Daten in einem Paket („Kapsel“) zusammengefasst. In Java ist das Kapselungspaket die Klasse . Die Klasse enthält sowohl Daten (Felder) als auch Methoden zum Arbeiten mit diesen Daten. Für Sie mag das offensichtlich erscheinen, aber in anderen Programmierparadigmen ist alles anders geregelt. Beispielsweise werden in der funktionalen Programmierung Daten strikt von Datenoperationen getrennt. Bei der objektorientierten Programmierung (OOP) bestehen Programme aus Kapseln (Klassen), die sowohl aus Daten als auch aus Funktionen für die Arbeit mit Daten bestehen.
Lassen Sie uns nun über das Verstecken von Informationen sprechen
Wie nutzen wir alle möglichen komplexen Mechanismen, ohne zu verstehen, wie sie aufgebaut sind oder wie sie funktionieren? Es ist ganz einfach: Ihre Entwickler haben einfache und praktische Schnittstellen bereitgestellt. Bei einem Getränkeautomaten sind die Tasten auf der Vorderseite die Schnittstelle. Mit einem Knopf können Sie die Körbchengröße auswählen. Mit einem zweiten Knopf wählen Sie den Sirup aus. Ein Drittel ist für die Eiszugabe zuständig. Und das ist alles, was Sie tun müssen. Es spielt keine Rolle, wie die Maschine innen aussieht. Wichtig ist, dass es so konzipiert ist, dass der Benutzer durch Drücken von drei Knöpfen Limonade erhält. Dasselbe gilt auch für ein Auto. Es spielt keine Rolle, was im Inneren vor sich geht. Wichtig ist, dass sich das Auto vorwärts bewegt, wenn Sie das rechte Pedal betätigen, und wenn Sie das linke Pedal betätigen, wird das Auto langsamer. Dies ist die Essenz des Verbergens von Informationen. Alles ein Programm‘ Die „Innere“ von s bleiben dem Benutzer verborgen. Solche Informationen sind für den Nutzer überflüssig oder unnötig. Der Benutzer benötigt ein Endergebnis, keinen internen Prozess. Schauen wir uns als Beispiel das anFahrzeugklasse :
public class Vehicle {
public void gas() {
/* Some complicated things happen inside a car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside a car.
As a result, it slows down */
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
// How everything looks to the user
// Press one pedal, the car moves
vehicle.gas();
// Press the other pedal, the car brakes
vehicle.brake();
}
}
Auf diese Weise wird die Implementierung in einem Java-Programm versteckt. Genau wie im echten Leben: Dem Benutzer wird eine Schnittstelle (Methoden) zur Verfügung gestellt. Wenn Sie in einem Programm ein Auto benötigen, um eine Aktion auszuführen, rufen Sie einfach die gewünschte Methode auf. Was innerhalb dieser Methoden passiert, ist überflüssig. Wichtig ist, dass alles so funktioniert, wie es soll. Hier haben wir über das Verstecken der Implementierung gesprochen. Java verfügt auch über das Verstecken von Daten. Wir haben in der Lektion über Getter und Setter darüber geschrieben , aber eine Erinnerung kann nicht schaden. Wir haben zum Beispiel eine Cat- Klasse:
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("Meow!");
}
}
Vielleicht erinnern Sie sich aus einer früheren Unterrichtsstunde, was das Problem mit dieser Klasse ist? Wenn nicht, erinnern wir uns. Das Problem besteht darin, dass seine Daten (Felder) für jedermann zugänglich sind. Ein anderer Programmierer könnte leicht eine namenlose Katze mit einem Gewicht von 0 und einem Alter von -1000 Jahren erstellen:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
In dieser Situation könnten Sie sorgfältig verfolgen, ob einer Ihrer Kollegen Objekte mit ungültigem Status erstellt, aber es wäre viel besser, sogar die Möglichkeit der Erstellung dieser ungültigen Objekte auszuschließen. Wir erreichen das Verstecken von Daten mit Hilfe von:
- Zugriffsmodifikatoren ( privat, geschützt, Paketstandard );
- Getter und Setter.
Die Kapselung bietet uns mehrere wichtige Vorteile:
- Überwachung des korrekten Objektstatus. Wir haben oben Beispiele dafür gegeben: Dank des Setters und des privaten Modifikators haben wir unser Programm gegen Katzen mit einer Gewichtung von 0 abgesichert.
- Benutzerfreundliches Bedienfeld. Wir lassen dem Benutzer nur Methoden offen. Der Benutzer muss sie lediglich anrufen, um ein Ergebnis zu erhalten. Und es ist überhaupt nicht nötig, sich mit den Einzelheiten ihrer Funktionsweise zu befassen.
- Codeänderungen wirken sich nicht auf Benutzer aus. Wir nehmen alle Änderungen innerhalb von Methoden vor. Dies hat keine Auswirkungen auf die Benutzer: Sie haben „vehikel.gas()“ geschrieben , um das Gas anzuwenden, und das werden sie auch weiterhin tun. Die Tatsache, dass wir innerhalb der gas()- Methode etwas geändert haben, bleibt unsichtbar: Sie erhalten wie zuvor einfach das erforderliche Ergebnis.
GO TO FULL VERSION