2009-06-24 4 views

Antwort

2

kurze Antwort: ja

Ich war nicht in der Lage, den genauen Abschnitt der Java Language Specification zu finden. Bitte helfen Sie. :)

+0

bitte, gibt es einen zwielichtigen Fall, wenn die Regel nicht gilt? –

+3

Eine andere kurze Antwort: Nr. –

+0

@ Joao: in Java statischen Modifikator bedeutet genau "zur Kompilierzeit". Die Methode/Variable ist statisch am Klassennamen gebunden. Keine Ausnahmen. – dfa

4

Ja, aber wenn die statische Methode zur Laufzeit entfernt wurde, wird die passende Methode in der Basisklasse aufgerufen (Name und Signatur müssen exakt mit der ursprünglichen Methode aus der Kompilierzeit übereinstimmen und die Methode muss von JVM zugänglich sein) Spezifikationsregeln).

Um zu klären, betrachten Aufruf Code:

Derived.fn(); 

und die folgenden genannt Code:

class Base { 
    public static void fn() { 
     System.err.println("Base"); 
    } 
} 
class Derived extends Base { 
    public static void fn() { 
     System.err.println("Derived"); 
    } 
} 

Drucke Derived.

Jetzt kompiliere ich alles. Anschließend neu kompilieren geändert nur abgeleitet:

class Derived extends Base { 
} 

Drucke Base.

Vielleicht anschließend neu kompilieren ich gerade geändert abgeleitet:

class Derived { 
} 

einen Fehler wirft.

+2

"Von der Laufzeit entfernt"? Was bedeutet das? –

+0

Ich denke es bedeutet: Wenn eine Klasse kompiliert wird, um Sub.x() aufzurufen, dann wird die Methode x() aus Sub gelöscht, aber die Aufrufer-Klasse wird nicht neu kompiliert, zur Laufzeit wird Base.x() aufgerufen Es existiert. – erickson

+0

+1 wahrscheinlich ist dies der richtige Ansatz für diese Frage – dfa

8

Mehrere Zitate:

„Wenn die Compiler die Klasse kompiliert es bei der Kompilierung entscheidet die genaue Methode für jeden statischen Methodenaufruf aufgerufen wird (das ist der große Unterschied zu nicht-statischer Methode aufruft: die genaue Methode, um aufgerufen wird nur zur Laufzeit in diesen Fällen entschieden). "

"Der Aufruf statischer Methoden hängt immer von der Art der Kompilierung ab, für die sie aufgerufen wird."

+0

Richtige Antwort für die Frage, aber das Zitat über nicht-statische Methoden, die nur zur Laufzeit entschieden werden, ist falsch. Nur überschriebene Methoden werden zur Laufzeit festgelegt, andere werden zur Kompilierzeit festgelegt, einschließlich überschrieben. – Robin

+0

@Robin: das Zitat ist nicht meins, guter Punkt aber :) –

+0

Der Link scheint tot –