2017-07-11 18 views
3

これは、継承について勉強中にオンラインで見つけた例です。Javaの継承とメソッドのオーバーライド

class Animal { 
     public void move() { 
      System.out.println("Animals can move"); 
     } 
    } 

class Dog extends Animal { 
    public void move() { 
     System.out.println("Dogs can walk and run"); 
    } 
} 

public class TestDog { 

    public static void main(String args[]) { 
     Animal a = new Animal(); 
     Animal b = new Dog(); 

     a.move(); // runs the method in Animal class 
     b.move(); // runs the method in Dog class 
    } 
} 

私の主な混乱がメインメソッドの行です:私は理解してAnimal b = new Dog();

  1. 動物が
  2. bはメモリの新しいオブジェクト参照
  3. あるクラス名です割り当て
  4. 犬はコンストラクタコールです

しかし、 'b'はあまりにも正確に言及していますか? Animal b = new Dog();とは何ですか? DogがAnimalを継承している場合、なぜAnimal b = new Dogで、Dog b = new Dog();ではないのですか?私はAnimal b = new Dog();

+1

動物のB =新しい犬()、動物の参照と犬のオブジェクトを意味? –

+2

'B'がDog' 'のインスタンスを参照しているが、 'B'は、羊の服で' Animal' ...オオカミのインスタンスとして動作している - 多型 – MadProgrammer

+2

への歓迎をあなたは '一覧リスト=新しいのArrayListを<使用しない理由>() '?特定の実装からコードを分離する。動物や犬と同じです。あなたの犬が猫になったとき、動物を使用することはまだ正しいので、コードには1回の変更しか必要ありません。 –

答えて

4
Animal b; 

との違いがどうなるかDog b = new Dog();とその行を、置換していた場合 はその店Animalオブジェクトbという変数を宣言します。 はAnimalの一種ですか?はい。だから犬はbに入れることができます。完璧にOK。

犬は動物を拡張する場合は、なぜそれがそのコードのすべてだ場合は、明らかな理由はありませんAnimal b = new DogないDog b = new Dog();

です。コードを書いた人は、このようにしましょう、そうしました。

コードを書いた人は、後で他の動物を保存したいかもしれません。 Cat。彼がDog bのように宣言した場合、後でCatを格納することはできません。

もう1つの理由は、多型性を示すことだけかもしれません。 「はい、あなたは実際に動物の変数に犬を割り当てることができます。これは、犬が動物を広げるからです!

Animal bDog bの違いは何ですか?

現在のコードでは、違いはありません。しかし、あなたがDogにいくつかのメンバーを宣言すれば、違いがわかります。 Dogbarkというメソッドを書きましょう。 Animal bの場合はbarkにアクセスできませんが、Dog bの場合はアクセスできます。これは前者の場合、bAnimalであり、Dogではないとコンパイラは考えるからです。 (実際には、タフです)

+0

インターフェイスにプログラミングしたり、カップリングを緩くするなどの優れたプラクティスにもっとストレスを感じる必要があります。*「すべてのコードであれば明らかな理由はありません」*。そうでなければ良い説明。 –

2

Dog b = new Dog()を使用する際に問題はありません。 これは単純にDogオブジェクトを作成します。 Now、 Animal a = new Animal();
動物b =新規Dog();

オブジェクト参照はありますが、実行時にDogオブジェクトが作成されます。したがって、基本的に、スーパークラス参照を使用してサブクラスオブジェクトをインスタンス化できます。これは、スーパークラス参照を使用してサブクラスメソッド "move"を呼び出すことができるように、メソッドオーバーライドを表示するためにのみ使用されます。

-1

"="の左手は変数 "b"の宣言クラスを意味し、右手は正確なクラスです。

クラスDogはクラスAnimalを拡張しました.1つの変数は親クラスとして宣言し、サブクラスで実装できます。

以下のコードを実行すると、「true」を取得できます。

System.out.println(b instanceof Animal); // true System.out.println(b instanceof Dog); //真

関連する問題