2011-07-07 15 views
12

Ho letto una sezione statica nella guida di studio SCJP, e cita il seguente:Che cosa significa ridefinire i metodi statici in Java?

metodi statici non possono essere sovrascritte, ma possono essere ridefiniti

Cosa significa ridefinire in realtà? È un caso di avere un metodo statico che esiste sia in genitore che in figlio, con la stessa firma, tuttavia vengono indicati separatamente dai loro nomi di classe? Come ad esempio:

class Parent 
{ 
    static void doSomething(String s){}; 
} 

class Child extends Parent 
{ 
    static void doSomething(String s){}; 
} 

riferimento come: Parent.doSomething(); e Child.doSomething();?

Inoltre, lo stesso vale per le variabili statiche o solo per i metodi statici?

risposta

17

Significa semplicemente che le funzioni non sono virtuali. Ad esempio, supponiamo di avere un oggetto di tipo (runtime) Child a cui fa riferimento una variabile di tipo Parent. Poi, se si richiama doSomething, il metodo della Capogruppo doSomething viene richiamato:

Parent p = new Child(); 
p.doSomething(); //Invokes Parent.doSomething 

Se i metodi erano non-statico, doSomething del bambino sarebbe ignorare quello della Capogruppo e child.doSomething sarebbe stato invocato.

Lo stesso vale per i campi statici.

6

Statico indica che ce n'è uno per classe, anziché uno per oggetto. Questo è vero per entrambi i metodi e le variabili.

Un campo statico implicherebbe che vi sia uno di questi campi, indipendentemente dal numero di oggetti di quella classe creati. Si prega di dare un'occhiata a Is there a way to override class variables in Java? per la domanda di sovrascrivere un campo statico. In breve: un campo statico non può essere ignorato.

Considerate questo:

public class Parent { 
static int key = 3; 

public void getKey() { 
    System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
} 

public class Child extends Parent { 

static int key = 33; 

public static void main(String[] args) { 
    Parent x = new Parent(); 
    x.getKey(); 
    Child y = new Child(); 
    y.getKey(); 
    Parent z = new Child(); 
    z.getKey(); 
} 
} 

I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 3 
I am in class tools.Child and my key is 3 

chiave non torna più come 33. Tuttavia, se si ignora getKey e aggiunge questo al bambino, allora i risultati saranno diversi.

@Override public void getKey() { 
System.out.println("I am in " + this.getClass() + " and my key is " + key); 
} 
I am in class tools.Parent and my key is 3 
I am in class tools.Child and my key is 33 
I am in class tools.Child and my key is 33 

Sovrascrivendo il metodo getKey, è possibile accedere alla chiave statica di Child.

0

In risposta rajah9 se ora facciamo i due metodi statici sia in genitore e figlio:

public static void getKey() { 
     System.out.println("I am in and my key is " + key); 
    } 

Due cose da notare: ora Impossibile utilizzare 'this.getClass()' e di allarme 'The metodo getKey statico() dal tipo genitore dovrebbe essere letta in modo statico' anche

Parent z = new Child(); 
    z.getKey(); 

darà l'uscita

I am in class tools.Parent and my key is 3 

invece di

I am in class tools.Parent and my key is 33 
Problemi correlati