2009-06-24 11 views

risposta

2

risposta breve: sì

non ero in grado di trovare la sezione esatta della Java Language Specification. Per favore aiuto. :)

+0

per favore, c'è qualche caso oscuro quando la regola non si applica? –

+3

Un'altra breve risposta: No. –

+0

@Joao: nel modificatore statico Java significa esattamente "in fase di compilazione". Il metodo/variabile è associato staticamente al nome della classe. Nessuna eccezione. – dfa

4

Sì, ma se il metodo statico è stato rimosso dal runtime verrà chiamato il metodo di corrispondenza nella classe base (nome e firma devono corrispondere esattamente al metodo originale dal momento della compilazione e il metodo deve essere accessibile da JVM regole specifiche).

Per chiarire, prendere in considerazione il codice chiamando:

Derived.fn(); 

E il seguente codice di chiamata:

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

Stampe Derived.

Ora, compilo tutto. Quindi ricompilare solo Derivato cambiato a:

class Derived extends Base { 
} 

Stampe Base.

Forse allora io ricompilare solo derivati ​​cambiato a:

class Derived { 
} 

genera un errore.

+2

"Rimosso dal runtime"? Cosa significa? –

+0

Suppongo che significhi: se una classe è compilata per chiamare Sub.x(), allora il metodo x() viene cancellato da Sub ma la classe chiamante non viene ricompilata, in fase di esecuzione Base.x() verrà invocato se esiste. – erickson

+0

+1 probabilmente questo è l'approccio giusto per questa domanda – dfa

8

diverse citazioni:

"Quando il compilatore compila quella classe decide al momento della compilazione quale metodo esatto viene chiamata per ogni chiamata di metodo statico (questa è la grande differenza di metodo non statico chiama: il metodo esatto da chiamato è deciso solo in fase di esecuzione in questi casi). "

"La chiamata di metodi statici dipende sempre solo dal tipo di tempo di compilazione su cui è chiamato."

+0

Risposta corretta per la domanda, ma la citazione sui metodi non statici decisa solo in fase di esecuzione non è corretta. Solo i metodi sottoposti a override vengono decisi in fase di esecuzione, altri vengono determinati in fase di compilazione, anche se sottoposti a override. – Robin

+0

@Robin: la citazione non è mia, buon punto però :) –

+0

Il link sembra morto –

Problemi correlati