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!
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. ]
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.
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.
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.
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
.
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.
Tags und Links java