2008-11-23 12 views
17

So wurde ich eine Klasse den anderen Tag zu machen und verwenden Eclipse-Methode die Methode equals zu erstellen, wenn ich, dass es realisierte den folgenden Arbeits Code generiert:Java Privat Feld Sichtbarkeit

class Test { 
    private int privateInt; 
    [...] 
    public boolean equals(Object obj) { 
    [...] 
    Test t = (Test) obj; 
    if (t.privateInt == privateInt) { 
    [...] 
    } 
} 

t.privateInt .. ???? Es soll privat sein! Ich denke also, es gibt noch eine weitere Feldsichtbarkeit außer privat, geschützt, paketgeschützt und öffentlich.

Was passiert hier? Wie heißt das? Wo würde jemand das benutzen? Wird die Kapselung nicht unterbrochen? Was, wenn die Klasse keinen Mutator hat und ich das geändert habe? Passiert das auch mit C++? Ist das ein OO-Idiom? Wenn nicht, warum hat Java das getan?

Allgemein, wo kann ich Informationen darüber finden?

Vielen Dank.

Antwort

24

Es ist von verschiedenen Instanzen der gleichen Klasse zugänglich.

Nach this page (bolding von mir):

Am Mitglied Ebene können Sie auch den öffentlichen Modifikator oder kein Modifikator (Paket-private) ebenso wie mit Top-Level-Klassen, und mit dem gleichen Bedeutung. Für Mitglieder gibt es zwei zusätzliche Zugriffsmodifizierer: privat und geschützt. Der private Modifikator gibt an, dass auf das Element nur in seiner eigenen Klasse zugegriffen werden kann.

Aus Gründen der Klarheit ich diese Linie neu schreiben werde:

if (t.privateInt == this.privateInt) 

Wir können bestätigen, dass „this.privateInt“ erlaubt sein sollte: Sie können es innerhalb der Instanz der Klasse-Test zugreifen, dass die Nachricht "equals" wurde an gesendet.

Es ist weniger klar, dass "t.privateInt" sichtbar sein sollte, weil t eine separate Instanz der Klasse Test ist und wir nicht innerhalb seiner equals-Methode ausführen. Jedoch erlaubt Java dies, da beide Objekte (t und dieses) derselben Klasse Test angehören und sich gegenseitig private Mitglieder sehen können.

+0

OK ... Ich verstehe jetzt ... Aber WARUM? Warum hat Java das passieren lassen? Können Sie an einige Beispiele aus dem wirklichen Leben denken? Ich verstehe, warum es in equals funktionieren sollte. Aber es muss ein besseres Beispiel geben. – pek

+0

Die einzigen anderen Beispiele wären ähnlich wie bei equals, wo Sie eine andere Instanz Ihrer Klasse als Argument erhalten. Warum Java das getan hat, ist in OO-Sprachen ziemlich Standard - C++ funktioniert genauso. Überladen == in C++: http://artis.imag.fr/~Xavier.Decoret/resources/C++/operator=0.html –

+0

Soooo ... ist es ziemlich nutzlos Trivia? – pek

3

Sie referenzieren es aus der gleichen Klasse. So wissen Sie, was Sie tun und muss nicht vor sich selbst geschützt werden.

4

Mike ist ganz richtig; Sie verwechseln Objekte (Instanzen einer Klasse) mit der Klasse selbst. Die Mitglieder sind privat für die Klasse, keine bestimmte Instanz der Klasse.

Ich erinnere mich, dass ich genauso überrascht war, als ich neu in Java war.

+0

Oder er verwechselt this.field mit obj_of_same_class.field – Tom

+0

Könnten Sie vielleicht ein wenig mehr ausarbeiten oder einen Link zur Verfügung stellen, der mir helfen kann, ein wenig mehr zu verstehen. – pek

+0

Ich habe versucht, meine Antwort zu verbessern ... hoffe, es hilft –

1

Auf die privaten Variablen einer anderen Instanz derselben Klasse kann zugegriffen werden. Dies liegt daran, dass Sie sich direkt mit der Implementierung der Klasse beschäftigen, die Sie ohnehin über ihre internen "privaten" Variablen informiert.

0

Die einfache Antwort auf diese Verwirrung ist zu erinnern, dass private Feld nur sichtbar sind und nur in der Klasse, wo sie initialisiert werden (und definiert) .... Also wenn Sie ein Objekt der Klasse innerhalb der Klasse, Sie kann immer über die Objektreferenz auf das private Feld dieser Klasse zugreifen.Vielleicht fühlen Sie sich schwer, aber denken Sie, dass das private Feld wie ein öffentliches Feld ist, wenn Sie es in der Klasse verwenden, in der es definiert ist.

3

Ein wichtiger Grund, dass der Zugriff auf die privaten Mitglieder anderer Instanzen erlaubt ist, erlaubt "Kopier" -Funktionen - sie wären sonst so gut wie unmöglich. Wenn Sie den Zugriff durch andere Instanzen nicht zugelassen haben, was würden Sie dann für statische Methoden zulassen?