Eine knifflige Frage des einfachen Java: variabler Umfang

8

Ich bin nicht neu in Java und C #. Ich dachte, ich verstehe das Konzept des variablen Umfangs bis vor kurzem wurde mir diese Frage in einem Interview gestellt:

%Vor%

Definieren Sie die Ausgabe dieses Programms.

Ich habe die Frage während des Interviews beantwortet, dass die Ausgabe eine Laufzeitausnahme wäre. Zu meinem Verständnis wird y als privat deklariert, und die Instanzmethode call () versucht auf die private Instanzvariable y einer anderen Instanz der Klasse Q zuzugreifen. Wie kann das überhaupt passieren? Aber diese Frage falsch zu beantworten, hat mein Interview nicht zu sehr beeinflusst, weil das eine Art "knifflige Grundfrage" ist. Aber falsch zu antworten bedeutet, dass die Java-Erfahrung meiner Jahre eine Reha braucht, das ist schrecklich!

Könnte mir jemand in dieser Angelegenheit helfen? Ich würde so sehr geschätzt werden!

    
lixiang 21.06.2011, 13:43
quelle

8 Antworten

24

Sie können auf private Mitglieder Ihrer eigenen Klasse zugreifen, sogar von einer anderen Instanz der Klasse.

    
SLaks 21.06.2011, 13:45
quelle
8

private bedeutet nur, dass auf Objekte von anderen -Klassen nicht zugegriffen werden kann, nicht auf andere andere Objekte. So kann ein Objekt Q auf die privaten Mitglieder eines anderen Objekts Q zugreifen.

[ Beachten Sie, dass dies, wenn dies illegal wäre, einen Compilerfehler und keine Laufzeitausnahme auslösen würde. ]

    
Oliver Charlesworth 21.06.2011 13:45
quelle
6

Auf private Variablen kann innerhalb des Programmtexts der deklarierenden Klasse zugegriffen werden. Es spielt keine Rolle, wenn eine Instanz versucht, in einer anderen Instanz auf Variablen zuzugreifen, solange der Code innerhalb derselben Klasse liegt.

Aus dem JLS Abschnitt 6.6 :

  

Andernfalls, wenn das Mitglied oder der Konstruktor als privat deklariert ist, ist der Zugriff nur dann erlaubt, wenn er innerhalb des Hauptteils der obersten Klassenklasse (§7.6) auftritt, der die Deklaration des Mitglieds oder Konstruktors einschließt.

    
Jon Skeet 21.06.2011 13:46
quelle
3

private bedeutet, dass Klassen außerhalb dieser Klasse die Variable nicht sehen können. Innerhalb dieser Klassendefinition kann auf alle Methoden und Variablen zugegriffen werden.

    
lavinio 21.06.2011 13:47
quelle
3

Zugriffsbeschränkungen sollten nicht in der Laufzeit kompiliert werden, damit der Compiler den Code kompilieren sollte, wenn er falsch war.

Aber ein Zugriffsmodifizierer wird auf Klassenebene angewendet, sodass Sie immer auf ein privates Mitglied von der Klasse selbst zugreifen können.

Wenn Sie ein Objekt klonen, ist dies oft nützlich, da Sie einfach eine Menge von Werten im Klon direkt festlegen können, auf die sonst möglicherweise schwer zugegriffen wurde. Auch beim Vergleich von Objekten mit einer Equals-Methode kann es hilfreich sein, dass die Klasse und nicht die Instanz die Zugriffsbeschränkungen definiert.

    
faester 21.06.2011 13:48
quelle
3

Wie bereits erwähnt, sind private Mitglieder der anderen Instanzen von der Klasse aus erreichbar. Außerdem waren Sie bezüglich der Laufzeitausnahme falsch: Es wird keine Laufzeitausnahme geben, selbst wenn Sie den Code so ändern, dass Sie versuchen, auf ein privates Mitglied einer anderen Klasse zuzugreifen, wird der Code einfach nicht kompiliert.

    
Yuri 21.06.2011 13:52
quelle
2

Ich denke, es wird ein Kompilierungsproblem geben, weil das Attribut static int x = 11 als statisch deklariert wird und in der Methode call auf die Variable x von this zugegriffen wird. Sie können eine this nicht zu einer statischen Variable in einer Klasse machen.

Es gibt kein Problem mit dem privaten Mitglied y .

    
Dimitri 21.06.2011 13:50
quelle
2

Die richtige "Interview" Antwort lautet, dass derjenige, der Code wie diesen geschrieben hat, gefeuert werden sollte! Miserabler Klassenname, nutzlose Kommentare über den Umfang; nicht standardmäßige Verwendung von "this", die eigentlich nur für Instanzvariablen, nicht für Klassenvariablen verwendet werden sollte; Wiederverwendung von 'q' in den Haupt- und Aufrufmethoden.

Es erinnert mich an die verschleierten C ++ - Wettbewerbe, genau die Art von Unsinn, die Java vermeiden sollte.

Schlimmer als das ist jedoch, dass es sehr schwierig ist, aus den Kommentaren und den Antworten zu ersehen, wie der Output des Programms aussehen sollte. Gehe ich bei der '6' auf den Kommentar von Kevin?

Ich wünschte, ein Administrator würde das alles umgestalten. Und ich würde einem Interviewer sagen (wenn das wirklich eine Interviewfrage ist, was ich bezweifle), dass wir den Code ausführen, die Antworten bekommen und dann einen einfachen Test erstellen sollten, um zu bestätigen, dass sich die Antworten nicht ändern, wenn wir den Code umgestalten um der Standardnutzung zu entsprechen.

    
Ed Poor 29.04.2012 02:49
quelle

Tags und Links