11 Stimmen

Was bedeutet es, dass eine Methode in Java öffentlich/privat/anders ist?

Was bedeutet es, dass eine Methode in Java öffentlich/privat/anders ist?
Was sind die Vor- und Nachteile dieser Optionen?
Was veranlasst mich als jemand, der versucht, ein guter Programmierer zu sein, mich darum zu kümmern?

9 Stimmen

0 Stimmen

Ich unterstütze das Tutorial, oder ein grundlegendes OOP-Tutorial. Die Konzepte sind die gleichen für alle OO-Sprachen in Bezug auf Datenkapselung / Zugriff.

0 Stimmen

Was bedeutet OOP?

16voto

OscarRyz Punkte 189898

Wenn eine Methode öffentlich es bedeutet, dass andere Objekte darauf zugreifen können

Zum Beispiel:

class David {
     // public method, can be use by anyone
     public String getName() {
         return "David";
      }
 }

Die Methode getName kann von anderen Klassen aufgerufen werden, da sie öffentlich ist:

 class Other  {
      David davidOne = new David();
      String davidsName = davidOne.getName(); //<-- compiles and runs
 }

Der Vorteil ist, dass man sie auch von anderen Orten aus nutzen kann.

Wenn eine Methode privat bedeutet, dass nur Objekte auf sie zugreifen können DER GLEICHEN KLASSE

Zum Beispiel in dieser neuen Definition:

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instances" can use it.. 
     private int getAge() {
         return 19;
     } 

 }

Die Methode getAge kann nicht von anderen Klassen aufgerufen werden, da es privat ist. Wenn Sie dies versuchen, wird der Compiler eine Fehlermeldung ausgeben:

 class Other  {
      David davidOne = new David();
      String davidsName = davidOne.getName(); 
      int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible
 }

Aber, wenn Sie es benutzen können innerhalb David Klasse:

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instance" can use it.. 
     private int getAge() {
         return 19;
     } 
     // Here the call to "getAge()" will succeed, because it is visible 
     // inside the class 
     public boolean hasSameAgeAs( David otherDavid ) {
         return this.getAge() == otherDavid.getAge();
     }
 }

Der Vorteil? Sie können eine Reihe von Methoden erstellen und sie privat halten, um Datenverfälschungen zu vermeiden oder generell Ihre Objekte zu schützen. gekapselt

Über Verkapselung

En OOP ( objektorientierte Programmierung ) ist es das Ziel, die Software nach realen Objekten zu modellieren.

Objekte im wirklichen Leben haben (unter anderem) Attribute und Methoden, um auf diese Attribute zuzugreifen.

Sie möchten einige dieser Methoden öffentlich machen und andere geheim halten.

Zum Beispiel kann ein Menschen Wesen, ein Herz haben. Aber es ist nicht für jeden zugänglich, das wäre gefährlich. Es ist gekapselt in unserem Körper.

Wenn wir eine Software nach einem realen Vorbild modellieren würden Menschen können wir die Methode deklarieren: heartBeat als privat (damit niemand darauf zugreifen kann)

Auf der anderen Seite wäre es nützlich, wenn die öffentlich Methoden wie getGender um herauszufinden, ob Ihr Menschen Instanz männlich oder weiblich ist.

Es gibt weitere Zugangsmodifikatoren wie z. B.: "protected" und "package protected" (die kein Schlüsselwort haben)

 class David {
      // protected method
      protected int getBalance() { 
          return 1000000; 
      }
      // package protected or "default" method
      boolean knowsOop(){ 
          return true;
      }
 }

Dort wird die Methode getBalance kann nur erreicht werden von David Instanzen und David Unterklassen (erstellen Sie einen weiteren Thread für eine Unterklasse)

Die Methode knowsOop kann von jedem innerhalb des Pakets aufgerufen werden, da David definiert ist.

Machen Sie sich keine Sorgen über diese beiden Zugriffsmodifikatoren, sie werden Sinn machen, wenn Sie mehr über OOP und Java lernen.

Schließlich sollten Sie sich wirklich Zeit zum Lesen nehmen:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

Ich hoffe, das hilft

5voto

Mnementh Punkte 48509

Auf eine öffentliche Methode kann von überall her zugegriffen werden, auf eine private Methode nur von der gleichen Klasse. Der Hauptvorteil ist die Kontrolle über die API einer Klasse. Wenn ich nur das öffentlich mache, was benötigt wird, kann ich das interne Verhalten einer Klasse ändern, ohne Code zu zerstören, der von dieser Klasse abhängt. Das sollte Ihnen wichtig sein, denn in der realen Welt ändert sich Software häufig (zumindest ist das meine Erfahrung, und andere haben das auch), und je mehr jede Änderung kaputt geht, desto mehr Energie müssen Sie in die Wartung stecken oder desto mehr Fehler hat Ihre Software. Letzten Endes ist es eine Frage der Kosten.

Die Möglichkeit, Interna einer Klasse vor den Benutzern dieser Klasse zu verbergen, um zu vermeiden, dass der Code durch spätere Änderungen beschädigt wird, wird oft als Kapselung oder Informationsverschleierung .

Die beiden Optionen neben public und private sind package (ohne Modifikator) und protected. Auf die Methode package-accessible kann auch innerhalb von Klassen desselben Pakets zugegriffen werden. Ich kann mich nicht erinnern, diese Option sinnvoll genutzt zu haben. Auf geschützte Methoden kann von Klassen aus zugegriffen werden, die die betreffende Klasse erben. Das wird oft verwendet, um Klassen mit konkretem Verhalten für eine definierte API der Basisklasse zu erstellen. Zum Beispiel könnte man eine neue List-Klasse implementieren, indem man die AbstrakteListe und Sie müssen nur get und size implementieren (und eine set-Methode für veränderbare Listen). Die anderen Methoden der API von List werden in der Basisklasse definiert und rufen bei Bedarf die drei anderen Methoden auf.

1voto

brabster Punkte 41159

Die Modifikatoren public, protected und private steuern, welcher andere Code diese Methoden (oder Felder) sehen kann. Es geht darum, die Schnittstelle zu kontrollieren, die Sie offenlegen.

Die am häufigsten verwendeten sind:

Der öffentliche Modifikator: Jeder andere kann Ihre Methode sehen.

Der private Modifikator: Kein anderer Code als Ihre Klasse und alle inneren Klassen können Ihre Methode sehen.

Diese wären zum Beispiel nützlich, wenn Sie sicherstellen wollen, dass nur eine einzige Instanz einer Klasse erstellt wird ( Singleton-Muster ). Sie könnten den Konstruktor privat machen, eine einzelne Instanz erstellen und als privates Mitglied namens instance speichern und eine öffentliche Methode wie die folgende bereitstellen:

public static MyObject getInstance() {
  return instance;
}

und so können Sie garantieren, dass es jeweils nur eine Instanz gibt.


Update - ein weiteres Beispiel wie gewünscht.

Ein anderes Beispiel wäre eine komplizierte öffentliche Methode, die Sie in einfachere Teile zerlegen wollen. Sie könnten sie in einfachere Methoden aufteilen, von denen jede einen Teil der Aufgabe übernimmt, aber Sie würden nicht wollen, dass anderer Code diese Teilmethoden aufruft, da sie allein nicht funktionieren würden - also würden Sie die kleineren Methoden privat machen und sicherstellen, dass sie nicht außerhalb Ihrer Klasse aufgerufen werden können.

0 Stimmen

Könnten Sie bitte näher auf die Nützlichkeit eingehen?

0 Stimmen

Könnte MyObject nicht auch mehrfach aufgerufen werden? Würde dies nicht zur Erstellung mehrerer Instanzen der Klasse führen?

0 Stimmen

Nein - der Aufruf von MyObject.getInstance() erstellt keine neue Instanz, sondern gibt nur die bereits erstellte zurück. Bei wiederholten Aufrufen wird immer dieselbe Instanz zurückgegeben.

1voto

Dmitry Punkte 2913

Privat Methoden können nur innerhalb der Klasse aufgerufen werden. Sie können aufrufen öffentlich Methoden Ihrer Klasse an beliebiger Stelle im Programm. Methoden ohne Zugriffsmodifikator sollen den Sichtbarkeitsbereich des Pakets haben (dies wird als Standard ), so dass Sie es überall im Paket aufrufen können, wo die Klasse definiert ist.

Ver http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

0 Stimmen

Was veranlasst mich, dafür zu sorgen, dass eine Methode nur innerhalb der Klasse aufgerufen werden kann?

0 Stimmen

Manchmal hat man eine Methode, die nur innerhalb einer Klasse benötigt wird. Dabei kann es sich um eine Konvertierungsfunktion oder ein anderes zusätzliches Stück Code handeln.

1 Stimmen

Es ist nicht immer ratsam, eine Funktionalität, die durch eine öffentliche Methode offengelegt wird, im Körper dieser öffentlichen Methode selbst zu implementieren. Eine öffentliche Methode muss möglicherweise andere Methoden aufrufen, um ihr Verhalten auszuführen. Diese anderen Methoden sind daher für den internen Gebrauch bestimmt und sollten als privat gekennzeichnet werden.

0voto

Andrey Punkte 57704

Der Hauptgrund dafür heißt Kapselung: keinen Zugriff auf den internen Zustand eines Objekts gewähren.

0 Stimmen

Könnten Sie bitte mehr ins Detail gehen?

0 Stimmen

Ein Objekt kann einen Zustand haben, z. B. kann es die Eigenschaften von veränderbaren Vorder- und Hintergrundfarben haben. Dieser Zustand wird in dem Objekt als Wert(e) einer oder mehrerer Variablen gespeichert. Der Implementierer kann Beschränkungen dafür festlegen, wie sich die Farben ändern dürfen (z. B. dürfen nicht beide Farben gleich sein). Wären die Variablen öffentlich und direkt zugänglich, könnten Benutzer die Bedingung (auch bekannt als Invariante) verletzen und das Objekt in einen unerwarteten/unzulässigen Zustand überführen. Der Implementierer kann stattdessen die Variablen privat machen und gültige Mutationen über eine öffentliche Methode zulassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X