2015-10-22 10 views
5

これは問題ではありませんが、私は理解できません。サブクラスjavaのスーパークラスメンバ "override"

これはanimal.javaです。私はそれをすべての動物のサブクラスのスーパークラスにしたい。すべてのサブクラスと同じパッケージに入っています。

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

この

は明らかに、これは実行されませんcow.java

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

です。しかし、私はCow.sound()を実行して、出力に "moo"を読み込ませたいと思っています。私はまた、独自の文字列で '呼び出し'をオーバーライドするより多くのクラスを作成できるようにしたい。代わりに私は何をしなければなりませんか?

+0

classname.variableでクラス変数をそのまま使用します。静的メソッドと変数はオーバーライドできないためです。だから、あなたが呼び出さなければならない変数を変更したいならば、Animal.call = Shriram

+0

は 'void sound(String call){-----}'のように試してみてください – Uppicharla

+0

単に試してみるのではなく、静的属性を再定義するには? – christophetd

答えて

6

インスタンス変数を上書きすることはできません。メソッドをオーバーライドすることができます。 soundメソッドをオーバーライドすることができます(静的メソッドをオーバーライドできないためインスタンスメソッドに変更した後)。soundが呼び出すメソッドをオーバーライドできます(たとえばgetSound())。そして、それぞれの動物には、独自のサウンドを返すことができます。

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

です... @Overrideを使用するとうまくいかないようですが、そうでないとうまくいきます。 フォローアップとして、静的メソッドでこれを行うことはできますか?オブジェクトは毎回同じままであるため、それらを説明することに意味はありません。それはちょうどより多くの記憶を使用する...右か? – Skeleton

0

変数が上書きされることはありませんので、supercall変数を置き換えるサブクラス変数はできません。 もう1つの方法は、メソッドをオーバーライドすることでしたが、その静的静的メソッドもオーバーライドできませんでした。

したがって、静的でないメソッドを上書きしない限り、現在の設定は不可能です。