Statische Methode, die den Zugriff auf nicht-statische Konstruktor?
Ich eine Prüfung abgelegt hatte gestern auf Java. Es ist etwas, das scheint wirklich zweideutig zu mir.
Regeln sind einfach:
- Statische Methode kann nicht Aufruf nicht-statischer Methoden.
-
Konstruktoren sind eine Art Methode mit keine Rückkehr geben.
public class Main { public static void main(String[] args) { Main p = new Main(); k(); } protected Main() { System.out.print("1234"); } protected void k() { } }
Main p = new Main() line prints 1234 k() line raises error
Also, warum konnte das passieren? Ist es nicht in Konflikt mit den Regeln von Java vor?
- Wenn es unmöglich war, ein Aufruf eines Konstruktors aus einer statischen Methode, dann könnte man nicht konstruieren, die ein beliebiges Objekt überhaupt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher, Sie können, aber Sie einen Gegenstand benötigen, rufen Sie die Methode auf.
In eine statische Methode ist, gibt es keine
this
Referenz zur Verfügung, sofoo()
(das entsprichtthis.foo()
) ist illegal.Wenn Sie sollten im Vergleich zu Methoden, würde ich sagen Konstruktoren sind näher an nicht-statische Methoden (da ist in der Tat ein
this
Referenz in einem Konstruktor).Gegeben, diese Ansicht, es sollte Ihnen klar sein, warum eine statische Methode Aufruf eines Konstruktors ohne Probleme.
Also, um es zusammenzufassen:
ist okay, da
new Main()
sich nicht auf ein vorhandenes Objekt.ist nicht okay, da es äquivalent ist zu
this.k()
undthis
ist nicht verfügbar in Ihrem (static) main-Methode.new main()
ist NICHT mit einem einfachen Konstruktor-rufen-es ist die Anwendung der unären operatornew
während Sie angeben, mit welchem Konstruktor aufrufen als Teil einer viel breiteren Allokation+Initialisierung-Prozedur.new
reserviert Speicher auf dem heap -- ist das nicht geschrieben in dem Konstruktor, für eine. Es fordert auch alle Instanz-Initialisierungen - eine weitere Tatsache, die sicherlich auch für Sie offensichtlich. Das ist auch irgendwo nicht geschrieben im Konstruktor-code. Es ruft auch den Konstruktor mitthis
plötzlich definiert-nicht vom Anrufer, sondern von impliziten Codes. Konstruktor ist nichts anderes als ein Rückruf, wirklich.this
plötzlich materialisiert, ich bin mir nicht sicher definiert ist, in der language-Spezifikation. (Ich kann mich irren aber.)new X()
ist eine bloße Funktion Anruf-und das ist der Kern der Punkt, da Menschen routinemäßig visualisieren es so machen und fehlgeleiteten Vergleiche zu anderen Arten von Funktionen in Java.Das ist einfach nicht wahr. Eine statische Methode kann rufen Sie eine nicht-statische Methode nur durch ein "target" Referenz. Zum Beispiel, das ist in Ordnung, in einer statischen Methode:
Den real Punkt "es gibt keine
this
Referenz, die innerhalb einer statischen Methode".Ist das nicht ein wirklich nützliches Modell, um ehrlich zu sein. Es macht mehr Sinn (aus der Anrufer-Sicht) zu betrachten einen Konstruktor wie eine statische Methode mit einem return-Typ, der das gleiche wie die Deklaration der Klasse, aber auch das ist nicht ein ideales Modell, mit allen Mitteln.
Ich schlage vor, Sie denken ein Konstruktor, der als eine andere Art von Mitglied. Umarmen die Unterschiede zwischen Konstruktoren und Methoden, anstatt zu versuchen, Sie zu verstecken.
new
und ruft nicht alle Funktionen. Das ist in der Tat meine wichtigste Punkt-man muss Respektnew
, nicht durch Sie. Die Betreiber der Rückgabewert ist die Referenz und der Konstruktor kann immer noch gesehen werden alsvoid
-Rückkehr Rückruf. Ich bin damit einverstanden, dass Analogien können nur so weit gehen, aber Sie noch helfen, wenn etwas neues zu lernen.new
ist nicht ist ein operator - nicht nach der Sprache-Spezifikation. Ich Stimme völlig, dass genaue Definitionen sind wichtig - das ist, warum ich denke, es ist einfacher zu behandeln Konstruktoren als "etwas anderes" eher als der Versuch, Analogien. Es ist einfacher, um genau zu sein, wenn Sie nicht passen, einen quadratischen Pflock in ein rundes Loch.Nicht. Konstruktoren sind nicht gewöhnliche Methoden in diesem Zusammenhang. Der springende Punkt der Konstruktor ist, auch, erstellen Sie eine neue Instanz der Klasse.
Also es kann aufgerufen werden, die im statischen Bereich zu. Nur denken Sie daran: wenn Sie den Bedarf für eine vorhandene Instanz der Klasse, um eine neue Instanz erstellen, würden Sie einfach nie in der Lage sein zu instanziieren, die es jemals.
Ein paar Klarstellungen:
Nicht ganz. Sie rufen eine nicht-statische Methode innerhalb einer statischen Methode, nur müssen Sie Umfang Sie auf ein bestimmtes Objekt der Klasse. I. e.
perfekt funktionieren würde in deinem Codebeispiel oben.
Den Anruf
wäre in Ordnung, innerhalb einer Instanz (nicht statische) Methode. Und es wäre äquivalent zu
STILLSCHWEIGENDE
this
bezieht sich auf die aktuelle Instanz der Klasse. Immer wenn der compiler auf ein unqualifizierter Aufruf wiek()
innerhalb einer Instanz-Methode, es wird automatisch ein Rahmen ist es mitthis.
. Jedoch, da statische Methoden sind nicht gebunden an eine Instanz der Klasse (und der compiler) nicht findenthis
innerhalb einer statischen Methode. Daher müssen Sie explizit die Namen einer Instanz der Klasse aufrufen eine Instanz-Methode auf.