Statischer Methodenzugriff auf nicht statischen Konstruktor?

8

Ich hatte gestern eine Prüfung auf Java. Es gibt etwas, was mir wirklich zweideutig erscheint.

Regeln sind einfach:

  1. Die statische Methode kann nicht nicht statische Methoden aufrufen.
  2. Konstruktoren sind eine Art Methode ohne Rückgabetyp.

    %Vor%   %Vor%

Warum ist das passiert? Widerspricht es nicht den obigen Regeln von Java?

    
Ahmet Yildirim 09.05.2012, 09:46
quelle

3 Antworten

11
  

1 - Die statische Methode kann nicht nicht statische Methoden aufrufen.

Sicher können sie das, aber sie brauchen ein Objekt, um die Methode auf aufzurufen.

In einer statischen Methode ist keine this -Referenz verfügbar, daher ist foo() (was this.foo() entspricht) illegal.

  

2 - Konstruktoren sind eine Art Methode ohne Rückgabetyp.

Wenn sie im Vergleich zu Methoden sein sollten, I würde sagen, Konstruktoren sind näher an nicht statischen Methoden (da es tatsächlich einen this Verweis in einem Konstruktor gibt).

Angesichts dieser Ansicht sollte Ihnen klar sein, warum eine statische Methode einen Konstruktor ohne Probleme aufrufen kann.

Also, um es zusammenzufassen:

%Vor%

ist in Ordnung, da new Main() sich nicht auf ein vorhandenes Objekt verlässt.

%Vor%

ist nicht in Ordnung, da es mit this.k() und this nicht in Ihrer (statischen) Hauptmethode verfügbar ist.

    
aioobe 09.05.2012, 09:49
quelle
5
  

Regeln sind einfach:
  1 - Die statische Methode kann nicht nicht statische Methoden aufrufen.

Das ist einfach nicht wahr. Eine statische Methode kann eine nicht statische Methode aufrufen, nur über eine "Ziel" -Referenz. Zum Beispiel ist dies in einer statischen Methode in Ordnung:

%Vor%

Der echte Punkt ist "es gibt keine this Referenz in einer statischen Methode".

  

2 - Konstruktoren sind eine Art Methode ohne Rückgabetyp.

Das ist kein wirklich nützliches Modell, um ehrlich zu sein. Es macht mehr Sinn (aus der Sicht des Aufrufers), einen Konstruktor als statische Methode mit einem Rückgabetyp zu betrachten, der der deklarierenden Klasse entspricht, aber selbst das ist kein perfektes Modell.

Ich schlage vor, dass Sie einen Konstruktor als einen anderen Typ von Mitglied betrachten. Umfassen Sie die Unterschiede zwischen Konstruktoren und Methoden, anstatt zu versuchen, sie zu verstecken.

    
Jon Skeet 09.05.2012 09:50
quelle
5

Nein. Konstruktoren sind in dieser Hinsicht keine gewöhnlichen Methoden. Der ganze Sinn des Konstruktors besteht darin, eine neue Instanz der Klasse zu konstruieren.

So kann es auch im statischen Bereich aufgerufen werden. Denken Sie nur darüber nach: Wenn Sie eine existierende Instanz Ihrer Klasse benötigen, um eine neue Instanz davon zu erstellen, können Sie diese niemals instanziieren.

Einige Klarstellungen:

  

Die statische Methode kann nicht nicht statische Methoden aufrufen.

Nicht ganz. Sie können eine nicht statische Methode innerhalb einer statischen Methode aufrufen, Sie müssen sie jedoch nur für ein bestimmtes Objekt der Klasse scope definieren. Ie.

%Vor%

würde in Ihrem Codebeispiel oben perfekt funktionieren.

Der Anruf

%Vor%

wäre in einer Instanz (nicht statischen) Methode in Ordnung. Und es wäre gleichbedeutend mit

%Vor%

Das implizierte this bezieht sich auf die aktuelle Instanz der Klasse. Immer wenn der Compiler einen unqualifizierten Aufruf wie k() innerhalb einer Instanzmethode sieht, wird er automatisch auf this. umgelegt. Da statische Methoden jedoch nicht an eine Instanz der Klasse gebunden sind, können Sie (und der Compiler) nicht auf this in einer statischen Methode verweisen. Daher müssen Sie explizit eine Instanz der Klasse benennen, für die eine Instanzmethode aufgerufen werden soll.

    
Péter Török 09.05.2012 09:49
quelle

Tags und Links