2010-07-15 17 views
6

vorrei sapere il motivo per cui questo è consentito prima in Java (o oops in generale) Ricordo che i metodi statici sono comuni sia per il genitore e figlio classeRidefinire metodo statico nella classe figlia

public class Redefine extends Parent{ 
    public static void test() { 

    } 
} 


class Parent{ 
    public static void test() { 

    } 
} 

Q1: Poiché Override non è supportato per i metodi statici, in che modo entrambi possono contenere gli stessi metodi?

Q2: Se si modifica il metodo in statico per generare un'eccezione non definita, la sua non compilazione. perché è il caso. Ovviamente non ha la precedenza, quindi dovrei essere autorizzato a lanciare nuove eccezioni, giusto?

public class Redefine extends Parent{ 
    public static void test() throws Exception{ 

    } 
} 

risposta

10

A1:: static metodo si intendono per classe. Non hanno nulla a che fare con le gerarchie di ereditarietà in termini di polimorfismo. Quindi chiamare lo Parent.test() chiamerà il metodo genitore, mentre chiamando lo Redefine.test() chiamerà il bambino.

A2:JLS 8.4.8 scrive:

Se una classe dichiara un metodo statico m, quindi la dichiarazione m è detto di nascondere qualsiasi metodo di m', in cui la firma di m è un subsignature (§8.4 .2) della firma di m ', nelle superclassi e superinterfacce della classe che altrimenti sarebbero accessibili al codice nella classe.

Una dichiarazione di metodo non deve avere una clausola di lancio che contrasti (§8.4.6) con quella di qualsiasi metodo che esegue l'override o nasconde; in caso contrario, si verifica un errore in fase di compilazione.

0

Q1: i metodi statici non vengono sovrascritti, quindi si tratta di due metodi diversi con la stessa firma. Uno viene chiamato con Parent.test(), l'altro viene chiamato con Redefine.test()

Q2: il tuo metodo sembra valido. Che errore ottieni?

+1

re: Q2: Se si prova la versione OP di Redefine.test() dichiarata come 'genera Eccezione', si dovrebbe ottenere l'errore del compilatore' Exception Exception non è compatibile con la clausola throws in Parent.test() ' . – mikej

Problemi correlati