2015-10-22 28 views
5

Tipo di una domanda noob, questo, ma non riesco a capirlo."override" membro super classe in sottoclasse java

Questo è animal.java. Voglio che sia una superclasse per tutte le sottoclassi degli animali. È nello stesso pacchetto di tutte le sottoclassi.

public class Animal { 
    protected static String call = "Animals make noises, but do not have a default noise, so we're just printing this instead."; 
     public static void sound() 
     { 
      System.out.println(call); 
     } 
} 

Questo è cow.java

class Cow extends Animal { 
    call = "moo"; 
} 

Evidentemente, questo non viene eseguito. Ma voglio essere in grado di eseguire Cow.sound() e fare in modo che l'output legga "moo". Voglio anche essere in grado di creare più classi che sovrascrivono la 'chiamata' con la propria stringa. Cosa dovrei fare invece?

+0

Utilizzare subito la variabile di classe classname.variable. Perché i metodi statici e le variabili non possono essere sovrascritti. Quindi se vuoi cambiare la variabile devi chiamare Animal.call = Shriram

+0

provare qualcosa come 'void sound (String call) {-----}' – Uppicharla

+0

Perché non devi semplicemente sovrascrivere il metodo sound invece di provare ridefinire il tuo attributo statico? – christophetd

risposta

6

Non è possibile eseguire l'override delle variabili di istanza. Puoi solo eseguire l'override dei metodi. È possibile sovrascrivere il metodo sound (una volta modificato in un metodo di istanza, poiché i metodi statici non possono essere sovrascritti) oppure è possibile sovrascrivere un metodo chiamato da sound (ad esempio getSound()). Poi ogni animale può restituisce il proprio suono:

public class Animal { 
    static String call = "Animals make noises, but do not have a default noise, so we're just printing this instead."; 
    public void sound() 
    { 
     System.out.println(getSound()); 
    } 

    public String getSound() 
    { 
     return call; 
    } 
} 

class Cow extends Animal { 
    @Override 
    public String getSound() 
    { 
     return "moo"; 
    } 
} 
+0

... sembra che l'uso di @Override non funzioni, ma funziona bene se non lo faccio. Come follow-up, questo può essere fatto con metodi statici? Dal momento che gli oggetti rimangono sempre gli stessi, non ha senso instradarli, giusto? Usa solo più memoria ... giusto? – Skeleton

0

Le variabili sono mai sovrascritti, variabile di classe in modo da sub sostituzione variabile supercall non sarà possibile. Un'altra opzione era quella di sovrascrivere il metodo, ma anche il suo statico, statico, non può essere sovrascritto.

Quindi con l'installazione corrente non è possibile a meno che non si desideri sovrascrivere i metodi non statici.

Problemi correlati