logo

Java でのアップキャストとダウンキャスト

型キャストは、基本的に、あるデータ型から別のデータ型への暗黙的または明示的な変換を扱う最も重要な概念の 1 つです。この記事では、オブジェクトの型キャストの概念について説明します。
データ型と同様に、オブジェクトも型キャストできます。ただし、オブジェクトには親オブジェクトと子オブジェクトの 2 種類しかありません。したがって、オブジェクトの型キャストは基本的に、ある型のオブジェクト (つまり) が別の型の子または親になることを意味します。型キャストには 2 つのタイプがあります。彼らです:

    アップキャスト: アップキャストはタイプキャストです 子オブジェクトから親オブジェクトへ 。アップキャストは暗黙的に実行できます。アップキャストにより、親クラスのメンバーに柔軟にアクセスできますが、この機能を使用してすべての子クラスのメンバーにアクセスすることはできません。すべてのメンバーの代わりに、子クラスの一部の指定されたメンバーにアクセスできます。たとえば、オーバーライドされたメソッドにアクセスできます。ダウンキャスト: 同様に、ダウンキャストとは、 親オブジェクトから子オブジェクトへ 。ダウンキャストを暗黙的に行うことはできません。

次の図は、アップキャストとダウンキャストの概念を示しています。

アップキャストとダウンキャスト



例: 親クラスを作りましょう。親から多くの子供が生まれる可能性があります。一人の子供のことを考えてみましょう。子は親のプロパティを継承します。したがって、子供と親の間にはis-aの関係が存在します。したがって、子供は暗黙的に 上向きの 親に。ただし、親が子のプロパティを継承する場合もあれば、継承しない場合もあります。ただし、次のようにして親を子に強制的にキャストすることができます。 ダウンキャスト 。このタイプのキャストを明示的に定義した後、コンパイラはこのタイプのキャストが可能かどうかをバックグラウンドでチェックします。それが不可能な場合、コンパイラは ClassCastException をスローします。
違いを理解するために、次のコードを理解してみましょう。

ジャワ




// Java program to demonstrate> // Upcasting Vs Downcasting> // Parent class> class> Parent {> >String name;> >// A method which prints the> >// signature of the parent class> >void> method()> >{> >System.out.println(>'Method from Parent'>);> >}> }> // Child class> class> Child>extends> Parent {> >int> id;> >// Overriding the parent method> >// to print the signature of the> >// child class> >@Override> void> method()> >{> >System.out.println(>'Method from Child'>);> >}> }> // Demo class to see the difference> // between upcasting and downcasting> public> class> GFG {> >// Driver code> >public> static> void> main(String[] args)> >{> >// Upcasting> >Parent p =>new> Child();> >p.name =>'techcodeview.com'>;> >//Printing the parentclass name> >System.out.println(p.name);> >//parent class method is overridden method hence this will be executed> >p.method();> >// Trying to Downcasting Implicitly> >// Child c = new Parent(); ->コンパイル時エラー>>' // Downcasting Explicitly> >Child c = (Child)p;> >c.id =>1>;> >System.out.println(c.name);> >System.out.println(c.id);> >c.method();> >}> }>

>

>

出力

techcodeview.com Method from Child techcodeview.com 1 Method from Child>

上記のプログラムの図は次のとおりです。

アップキャストとダウンキャスト1

上記の例から、次の点がわかります。

    アップキャストの構文:
Parent p = new Child();>
  1. アップキャストは内部で行われ、アップキャストにより、オブジェクトは親クラスのメンバーと子クラスの指定されたメンバー (オーバーライドされたメソッドなど) のみにアクセスできますが、すべてのメンバーにはアクセスできません。
// This variable is not // accessible p.id = 1;>
    ダウンキャストの構文:
Child c = (Child)p;>
  1. ダウンキャストは外部で実行する必要があり、ダウンキャストにより、子オブジェクトが親オブジェクトのプロパティを取得できます。
c.name = p.name; i.e., c.name = 'techcodeview.com'>