2015-10-22 6 views
5

Eine Art Noob Frage, dies, aber ich kann es nicht herausfinden."override" Super-Klasse-Mitglied in der Unterklasse Java

Dies ist animal.java. Ich möchte, dass es eine Superklasse für alle Tierunterklassen ist. Es ist im selben Paket wie alle Unterklassen.

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); 
     } 
} 

Dies ist cow.java

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

Offenbar dies nicht ausgeführt. Aber ich möchte Cow.sound() ausführen und die Ausgabe "moo" lesen lassen. Ich möchte auch in der Lage sein, mehr Klassen zu erstellen, die den 'Aufruf' mit ihrer eigenen Zeichenfolge überschreiben. Was sollte ich stattdessen tun?

+0

Verwenden Sie die Klassenvariable sofort nach Klassenname.Variable. Weil statische Methoden und Variablen nicht überschrieben werden können. Also, wenn Sie die Variable ändern möchten, müssen Sie Animal.call anrufen = Shriram

+0

versuchen Sie etwas wie 'void sound (String Anruf) {-----}' – Uppicharla

+0

Warum überschreiben Sie nicht einfach die Sound-Methode, anstatt zu versuchen um dein statisches Attribut neu zu definieren? – christophetd

Antwort

6

Sie können Instanzvariablen nicht überschreiben. Sie können nur Methoden überschreiben. Sie können die Methode sound überschreiben (nachdem Sie sie in eine Instanzmethode geändert haben, da statische Methoden nicht überschrieben werden können), oder Sie können eine Methode überschreiben, die sound aufruft (z. B. getSound()). Dann wird jedes Tier gibt seinen eigenen Sound:

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

... es scheint, dass die Verwendung von @Override nicht funktioniert, aber es funktioniert gut, wenn ich es nicht tue. Als Follow-up, kann dies mit statischen Methoden erfolgen? Da die Objekte jedes Mal gleich bleiben, hat es keinen Sinn, sie instanziieren, oder? Es verwendet nur mehr Speicher ... richtig? – Skeleton

0

Variablen werden nie außer Kraft gesetzt, so Unterklassenvariable supercall Variable ersetzt wird nicht möglich sein. Eine andere Option war, die Methode zu überschreiben, aber dann kann ihre statische, statische auch nicht überschrieben werden.

Also mit der aktuellen Einrichtung ist es nicht möglich, es sei denn, Sie überschauen nicht statische Methoden.