クラス変数に関するアップキャストとダウンキャストの違いは何ですか



What Is Difference Between Up Casting



解決:

アップキャスティングはスーパータイプにキャストし、ダウンキャスティングはサブタイプにキャストします。アップキャストは常に許可されていますが、ダウンキャストには型チェックが含まれ、ClassCastException。

あなたの場合、犬に動物はアップキャストです、なぜなら犬は-a動物。一般に、2つのクラス間にis-a関係がある場合は、いつでもアップキャストできます。



ダウンキャストは次のようになります。

動物動物= new Dog();犬castedDog =(犬)動物;

基本的に、あなたがしていることは、オブジェクトのランタイムタイプが何であるかを知っていることをコンパイラに伝えることです。 本当 は。コンパイラーは変換を許可しますが、変換が適切であることを確認するために実行時の健全性チェックを挿入します。この場合、実行時にキャストが可能です。動物は実際には静的タイプにもかかわらず犬動物は動物。



ただし、これを行う場合:

動物動物=新しいAnimal();犬notADog =(犬)動物;

あなたは得るだろうClassCastException。その理由は動物のランタイムタイプは動物など、キャストを実行するようにランタイムに指示すると、動物は本当にではありません犬などが投げるClassCastException。

スーパークラスのメソッドを呼び出すには、次のことができます。super.method()またはアップキャストを実行します。



サブクラスのメソッドを呼び出すには、ダウンキャストを実行する必要があります。上に示したように、あなたは通常、これを行うことによるClassCastException;ただし、instanceof演算子を使用して、キャストを実行する前にオブジェクトの実行時型を確認します。これにより、次のことを防ぐことができます。ClassCastExceptions:

動物動物= getAnimal(); //たぶん犬?多分猫?多分動物? if(animal instanceof Dog){//クラスローダーのシェナニガンを除いて成功することが保証されていますDog castedDog =(Dog)animal; } 

ダウンキャストとアップキャストは次のとおりです。
ここに画像の説明を入力してください

アップキャスティング :サブクラスをスーパークラスにキャストする場合は、アップキャスティング(または拡張)を使用します。これは自動的に行われ、明示的に何もする必要はありません。

ダウンキャスティング :スーパークラスをサブクラスにキャストする場合は、ダウンキャスティング(またはナローイング)を使用します。Javaではダウンキャスティングを直接実行することはできません。明示的に行う必要があります。

Dog d = new Dog();動物a =(動物)d; //明示的にアップキャストを実行しました。実際には必要ありません。Animala= dのようにキャストを直接入力できます。コンパイラはDogを動物として扱うようになりましたが、d.callme()をアップキャストした後でもDogです。 a.callme(); //動物参照を使用していても、Dogのメソッドを呼び出します。 ((犬)a).callme2(); //ダウンキャスト:コンパイラは動物を認識します。Dogメソッドを使用するには、明示的に型キャストを行う必要があります。 //内部的には、Dogオブジェクトでない場合、ClassCastExceptionをスローします 

アップキャストとダウンキャストはJavaの重要な部分であり、単純な構文を使用して複雑なプログラムを構築でき、ポリモーフィズムやさまざまなオブジェクトのグループ化などの大きな利点があります。 Javaでは、サブクラスタイプのオブジェクトを任意のスーパークラスタイプのオブジェクトとして扱うことができます。これはアップキャスティングと呼ばれます。アップキャストは自動的に実行されますが、ダウンキャストはプログラマーが手動で実行する必要があります 、そして私はそれがなぜそうなのかを説明するために最善を尽くします。

アップキャストとダウンキャストは、プリミティブを相互にキャストするようなものではありません。プログラマーがオブジェクトのキャストを学び始めると、それが多くの混乱を引き起こすと思います。

ポリモーフィズム:Javaのすべてのメソッドはデフォルトで仮想です。つまり、そのメソッドがfinalまたはstaticとして宣言されていない限り、継承で使用されるときに任意のメソッドをオーバーライドできます。

以下の例をご覧ください。getType();オブジェクト(犬、ペット、警察犬)の種類に応じて動作します。

あなたが3匹の犬を飼っていると仮定します

  1. 犬-これはスーパークラスです。

  2. ペットの犬-ペットの犬は犬を拡張します。

  3. 警察犬-警察犬はペット犬を拡張します。

    public class Dog {public String getType(){System.out.println( 'NormalDog'); 'NormalDog'を返します; }} / ** * Pet Dogには追加のメソッドdogName()があります* / public class PetDog extends Dog {public String getType(){System.out.println( 'PetDog'); 'PetDog'を返します; } public String dogName(){System.out.println( '名前がありません!!'); 'NOName'を返します; }} / ** * Police Dogには追加のメソッドsecretId()があります* / public class PoliceDog extends PetDog {public String secretId(){System.out.println( 'ID'); 'ID'を返します。 } public String getType(){System.out.println( '私は警察犬です'); '警察犬'を返します。 }}

ポリモーフィズム:Javaのすべてのメソッドはデフォルトで仮想です。つまり、そのメソッドがfinalまたはstaticとして宣言されていない限り、継承で使用されるときに任意のメソッドをオーバーライドできます(説明は仮想テーブルの概念に属します)

仮想テーブル/ディスパッチテーブル:オブジェクトのディスパッチテーブルには、オブジェクトの動的にバインドされたメソッドのアドレスが含まれます。メソッド呼び出しは、オブジェクトのディスパッチテーブルからメソッドのアドレスをフェッチすることによって実行されます。ディスパッチテーブルは、同じクラスに属するすべてのオブジェクトで同じであるため、通常はオブジェクト間で共有されます。

public static void main(String [] args){/ ***スーパークラスリファレンスを使用してさまざまなオブジェクトを作成する* / Dog obj1 = new Dog(); `/ ** *ペット犬のオブジェクトは犬の参照を使用して作成されます。*アップキャストは自動的に行われるため、心配する必要はありません* * / Dog obj2 = new PetDog(); `/ ** * Police DogのオブジェクトはDogReferenceを使用して作成されます。*アップキャストは自動的に行われるため、心配する必要はありません。* PetDogを使用してPoliceDogを拡張している場合でも、* PetDogはDogJavaを自動的にアップキャストします。私たちのために* / Dog obj3 = new PoliceDog(); } obj1.getType();

プリント普通の犬

obj2.getType();

プリントペットの犬

obj3.getType();

プリント警察犬

ダウンキャストはプログラマーが手動で行う必要があります

あなたが呼び出そうとするとsecretID();上の方法obj3はPoliceDogオブジェクトですが、参照されています階層内のスーパークラスである犬は、obj3はにアクセスできませんsecretId()メソッド。 そのメソッドを呼び出すには、そのobj3を手動でダウンキャストする必要があります。 PoliceDog

((PoliceDog)obj3).secretID();

印刷するID

を呼び出すための同様の方法でdogName();メソッドのダウンキャストする必要があるPetDogクラスobj2からobj2が参照されているためPetDog犬とアクセスできませんdogName();方法

((PetDog)obj2).dogName();

なぜそうなのか、そのアップキャストは自動ですが、ダウンキャストは手動である必要がありますか?ええと、アップキャストは決して失敗することはありません。しかし、異なる犬のグループがあり、それらすべてをそれらのタイプにダウンキャストしたい場合は、これらの犬のいくつかが実際には異なるタイプである可能性があります。PetDog、PoliceDog、およびプロセスはスローすることによって失敗しますClassCastException。

これがあなたがする必要がある理由です オブジェクトを手動でダウンキャストします オブジェクトをスーパークラスタイプに参照している場合。

注:ここで参照するということは、オブジェクトをダウンキャストするときにオブジェクトのメモリアドレスを変更しないことを意味します。この場合は、オブジェクトを特定のタイプにグループ化するだけです。