2016-11-03 22 views
1

私は、Javaでアップキャストとダウンキャストについて説明しているstackoverflowの記事や質問がたくさんあることを知っていました。そして、私はアップキャストとダウンキャストが何であるかを知っていました。しかし、私の質問はそれにはあてはまらない。Java - アップキャスティングとダウンキャスト

アップキャスティング - 子から親への変換 - コンパイラが注意します。親から子への変換 - - いいえ、キャストは
ダウンキャストを必要とされない明示的なキャストが

public class Animal { 

    public void getAnimalName(){ 
     System.out.println("Parent Animal"); 
    } 
} 
public class Dog extends Animal{ 

    public void getDogName(){ 
     System.out.println("Dog"); 
    } 
} 

public static void main(String[] args) { 

     Dog d = new Dog(); 
     Animal a = d; // Upcasting 
     a.getAnimalName(); 

     Animal vv = new Dog(); 
     Dog cc = (Dog)vv;//DownCasting 
     cc.getAnimalName(); 
     cc.getDogName(); 



を要求されますが、それぞれがgetAnimalName()getDogName()のような、独自のメソッドを持っているAnimalDogクラスに見れば。したがって、Dog extends Animal(is-a関係)、派生クラス(Subclass)で基本クラス(Super Class)メソッドを使用することができます

メインメソッドの以下のコードを今考慮してください。
Dogオブジェクトw.rt Animalを作成します。だから私は今、私は、派生クラス

public class Dog extends Animal{ 

    @Override 
    public void getAnimalName(){ 
     System.out.println("Parent Animal overridden here"); 
    } 
    public void getDogName(){ 
     System.out.println("Dog"); 
    } 
}<br> 

、メインメソッド内に、基本クラスのメソッドをオーバーライドしたい、のは、言ってみましょうだけAnimalプロパティ(メソッド)

Dog d = new Dog(); 
Animal a = d; // Upcasting 
a.getAnimalName();<br> 
O/P : Parent Animal<br><br> 

にアクセスできるようにすることができます、私はDogオブジェクトWRT Animalを作成していたとしても

Dog d = new Dog(); 
Animal a = d; // Upcasting 
a.getAnimalName();<br> 
O/P : Parent Animal overridden here<br><br> 


、Bここでは、derviedクラスでオーバーライドされている基本クラスのメソッドを出力しています。

O/P : Parent Animal overridden here<br> 

なぜこのように動作するのだろうか。これはoverrideのためですか?

貴重なご意見をお寄せください。

+1

メソッドの参照は参照変数ではなく、参照変数の型に従って呼び出されます。メソッドをオーバーライドしないと、あなたがそれをオーバーライドすると、それは基本クラスから来ていません。 –

+0

_ "しかし、ここでは基本クラスメソッド" _ _を表示しています。これは、基本クラスメソッドが呼び出されていると思われます。あなたの言葉にもっと注意し、あなたが意味するものを明確にしてください。 –

答えて

0

親クラスでサブクラスを参照すると、参照ポインタ上のメソッド呼び出しでサブクラスメソッドが呼び出されます。

Dog d = new Dog(); 
Animal a = d; // Upcasting 
a.getAnimalName(); 

ここでa.getAnimalName();親クラスのメソッドが呼び出されるように、親クラスから継承されているので、サブクラスのgetAnimalName()メソッドを呼び出します。サブクラスの継承ではなく、直接ベースクラスでは呼び出されません。オーバーライドすると、サブクラスから即座に呼び出されます。メソッドの存在を確認するために親クラスに行く必要はありません。

しかし、副次的なことは、基本クラスリファレンスは、基本クラスで定義されていないサブクラスのメソッドを呼び出すことができないということです。

0
Animal a = d; 

この行は、Animalオブジェクト 'a'をDogクラス(Dog d = new Dog();)のインスタンスに設定します。したがって、関数を呼び出すと、クラスdogの関数が呼び出されます。

実際には、Dog Dog d = new Dog();というクラスのインスタンスを作成しました。次に、クラスAnimalのオブジェクトを作成し、それがクラスDogのインスタンスを指し示すようにします。Animal a = d;

関連する問題