2012-03-23 14 views
3

私はこの例で持っているか:もちろんJavaのOOPは:スーパークラスからサブクラスのオブジェクトの使用方法は、(そのメソッドがオーバーライドされている)

public class Inheritance { 

    public static class Animal {   
     public void Scream() { 
      System.out.println("I'm an animal"); 
     }  
    } 

    public static class Mammal extends Animal{ 
     public void Scream(){ 
      System.out.println("I'm a mammal"); 
     }  
    } 

    public static class Tiger extends Mammal{ 
     public void Scream(){ 
      System.out.println("I'm a tiger"); 
     }  
    } 

    public static void main (String[] args){ 

     Animal tiger = new Tiger(); 
     tiger.Scream(); 
    } 

} 

を、私は受け取ります:「私は虎です」。しかし、私は "私は哺乳類です"または "私は動物です"と印刷する方法を知らない

@:私の質問に答えてください:Tigerクラスの場合、Tigerのスーパークラスとは何ですか? 。 MammalまたはAnimal

は私を助けてください:)

感謝を::)

+3

。最初の質問は@Marcusの答えを見てください。 –

+1

@Truthあなたは私の2番目の質問のためにあなたの答えについてのリンクを教えてください。'less 'の答えのために、' Mammal'と 'Animal'は' Tiger'のスーパークラスです。ありがとうございました:) – hqt

+2

'Tiger'クラスの直接スーパーで' Mammal'、 'Mammal'のスーパーは' Animal'になります。これは 'Animal'を' Tiger'クラスの祖父(または祖先)にします。これは、 'Tiger'クラスの' super.super.Scream() 'が"私は動物です "と表示することを意味します。 –

答えて

1

オーバーライドでは、Javaは常に、そのオブジェクト実行時に作成されたチェックします。 「私は哺乳類です」という印刷物を希望する場合は、「私は哺乳類です」と印刷されます。あなたは、印刷をしたい場合

はまた、「私は動物だ」:

Animal a = new Animal(); 
a.Scream(); 
+2

いいえ、そういうことはできません。哺乳動物は動物のサブクラスなので – hqt

+0

私の間違いを知らせてくれてありがとう。更新されたコードを確認してください..... – kandarp

3

は、ここでのコードサンプルです:

public class Inheritance { 

    public static class Animal {   
     public void Scream() { 
      System.out.println("I'm an animal"); 
     }  
    } 

    public static class Mammal extends Animal{ 
     public void Scream(){ 
      super.Scream(); 
      System.out.println("I'm a mammal"); 
     }  
    } 

    public static class Tiger extends Mammal{ 
     public void Scream(){ 
      super.Scream(); 
      System.out.println("I'm a tiger"); 
     }  
    } 

    public static void main (String[] args){ 
     Animal tiger = new Tiger(); 
     tiger.Scream(); 
    } 

} 
+1

ああ。いいえ。それは私の考えではありません。宣言したクラスでスーパークラスを呼び出すと、すべてのオブジェクトがそのようになります。しかし、私は指定されたオブジェクトがほしいだけです。 – hqt

+0

ああ、あなたはあなたの質問をもう一度言い換えてください! – Marcus

+0

ああ、申し訳ありませんが私の質問がクリアされていない場合。私はサブクラスオブジェクトを使用しているので、そのオブジェクトのクラスは他のサブクラスなのです。 – hqt

0

Javaは、これは可能かもしれないC++のようではありません。

あなたは、各悲鳴方法でsuper.scream()を呼び出すことができますが、それは両方が表示されます。

「私は哺乳類だ」と「私は動物です」。

私はあなたがそれをしたいと思う理由はわかりません。

0

あなたはMammalクラスのオブジェクトを作成する必要があります「私は哺乳類だ」印刷します。

public static void main (String[] args){ 

    Animal mammal = new Mammal(); 
    mammal.Scream(); 
} 

「私は動物です」と印刷するには、Animalクラスのオブジェクトを作成する必要があります。

public static void main (String[] args){ 

    Animal animal = new Animal(); 
    animal.Scream(); 
} 

注:上記の両方の場合、参照変数は動物のままです。

+1

ああ。しかし、あなたが宣言するように、哺乳類は「私は哺乳類です」と言うでしょう。それは魔法ではありません。しかし、私は虎がまだ「私は哺乳類です」と言ってほしい。そして、もちろん、私は好きなだけの虎です。ありがとう:) – hqt

0

1)他の人がすでに述べたように、あなたがスーパークラスからオーバーライドされたメソッドを呼び出したい場合は、super.Scream()を呼び出します。哺乳動物がタイガーのスーパークラスであり、動物は哺乳類のスーパークラスであるため、タイガーはまた、動物を実装して、タイガーは、哺乳動物を実装

I'm an animal 
I'm a mammal 
I'm a tiger 

2):次のような出力を持っているでしょう。つまり、TigerのスーパークラスはTigerとAnimalです。

// all of this is valid: 
Tiger tiger = new Tiger(); 
Mammal mammal = tiger; 
Animal animal = tiger; 

あなたがanimal.Scream()を呼び出す場合、仮想マシンはanmialがタイプタイガーのものであり、タイガークラスで宣言悲鳴メソッドを呼び出すことを知っています。 Polymorphismを参照してください。 `Mammal`だろう

関連する問題