親参照がオブジェクトをサブクラス化する:Javaの変換の問題は、単に言って覚えて、複雑ではありません。
親クラスのサブクラスオブジェクトへの参照点は何ですか?
2用語で始まる:アップキャスト(アップキャスト) 、下方遷移(ダウンキャスト)。
たとえば:2つのクラスがあり、父は息子のクラスは父から継承し、親クラスです。
第一例:
父のF1 = 新しい新しい息子(); //これは、アップキャスト(アップキャスト)と呼ばれる//ターゲット息子に今のF1の参照息子S1 = (息子)F1 ; //この呼ばれるダウンキャスト(下向きの移行)//今のF1またはオブジェクトの息子を指しています
第二の例:
父F2 = 新しい新しい父(); 息子S2 = (息子)F2 ; //エラーサブクラスの参照が親クラスのオブジェクトを指すことはできません
あなたは、最初の例を頼むかもしれない:息子S1 =(息子)F1、 それが正しい理由を尋ねます。
非常に単純な点F1サブクラスのオブジェクトなので、父息子新しい新しい= f1は();サブクラスS1基準点は、当然のことながら、サブクラスのオブジェクトでもよいです。
F2は父、あるオブジェクトに渡される)の父、父の新しい新しい= F2(; S2サブクラスの参照は、親オブジェクトを指すことはできません。
要約:
1、親クラスのサブクラスのオブジェクトへの参照、および子クラスの基準点は、親クラスのオブジェクトではありません。
2、上向きに移行アップキャストと呼ばれる親クラスに直接割り当てられたクラスのオブジェクト参照を扱う、トランジションは、次のような、あなたをキャストする必要はありません。
父のF1 = 新しい息子();
:サブクラス3、クラス・オブジェクトのような、キャストする、下方遷移(ダウンキャスト)と呼ばれる親参照サブクラスへの参照を割り当て
f1は、サブクラスオブジェクトの親クラスの参照へのポインタです。サブクラスすなわちS1割り当て参照f1の 息子S1 =(SON)F1。
ここで前述のF1(息子は)それがキャストされ、追加する必要があります。
まず、上向きに推移。
もっと単純に、それは親オブジェクトにサブクラスのオブジェクトです。ここでは、親オブジェクトは、インタフェースとすることができます。
1、変換を呼び出す方法:
例
1匹の パブリック クラス動物{ 2 3 公共 ボイドは(){食べる 4 のSystem.out.println( "動物eattingを..." )。 5 } 6 } 7 クラスバード延び動物{ 8 9 公共 ボイド(){食べる 10 のSystem.out.println( "鳥eattingを..." )。 11 } 12 13 公共 ボイドフライ(){ 14 15 のSystem.out.println( "鳥の飛行..." )。 16 } 17 } 18は クラスメイン{ 19。 パブリック 静的 ボイドdoEat(動物H){ 20は h.eat(); 21である } 22が パブリック 静的 ボイドメイン(文字列[]引数){ 23れる 24 匹B = 新しい新規鳥類(); // アップキャスト 25 b.eat(); 26である // !エラー:b.fly(); B点、サブクラスオブジェクトが、今回は()メソッドフライを失った 27 Animail C1 = 新しい新;動物() 28 バードC2 = 新しい新バード() ; 29 doEat(C1); 30 doEat(C2); //パラメータは、アップキャストここに存在している 31 } 32 }
上向きに推移ことに注意してください:
アニマルB = 新しい新しい鳥(); //アップキャストのB 。EAT ();
ここでは、サブクラスの食べる()メソッドが呼び出されます。理由:鳥が実際にサブクラスにB点が呼び出されたときに、サブクラス自体が呼び出されます。
場合上向きの遷移を除いてBが親オブジェクトに失われる他の方法があることに留意されたいです。本実施形態の方法でフライは、すべてのBはありません。
図2に示すように、上向きにトランジション効果
上記のコードを見てください:
パブリック静的ボイドdoEate (Animailの時間){ H 。睡眠(); }
ここで、親クラスのパラメータ、パラメータとしてサブクラス時にはトーン、上向きの遷移を使用することです。これは、コードがシンプルになります。それ以外の場合は、パラメータとしてサブクラスオブジェクトへのdoEate場合、サブカテゴリの数は多くの機能を記述する必要があります。また、抽象Javaプログラミングのアイデアを反映しています。
第二に、意気消沈。
サブクラスオブジェクトに親オブジェクトである上向きの遷移とは対照的です。
例
1つの パブリック クラスAnimail { 2 プライベート文字列名=「Animail」。 3 公共 ボイド(食べる){ 4 のSystem.out.println(名前は+ "eate" )。 5 } 6 } 7つの 8 パブリック クラスがヒトに延びAnimail { 9 プライベート文字列名= "ヒト" 。 10 公共 ボイドは(){食べる 11 のSystem.out.println(名+ "eateを" )。 12 } 13 } 14 15 パブリック クラスメイン{ 16 公共 静的 ボイドメイン(文字列[]引数){ 17。 Animail A1 = 新しい新規ヒト(); // アップキャスト 18で Animail A2 = 新しい新しいAnimail(); 19 ヒトB1 =(ヒト)A1; // へリストラ下で、エラーなしでコンパイルして実行されている 20 ヒトc =(ヒト)A2が; // 危険意気消沈、それは間違っているためにエラーフリーランをコンパイルします 21 } 22 }
Animail A1 =新しい人間(); //アップキャスト
ヒトB1 =(ヒト)A1; //ダウンキャストコンパイルエラーなしで実行されています
ここでダウンキャストは安全です。A1ためサブクラスオブジェクトを対象とします。
と
Animail animail A2 =新しいです();
ヒトC =(ヒト)A2; //意気消沈安全ではないが、それは間違っていると、エラー・フリーランをコンパイルします
実行時エラー:
スレッド「メイン」にjava.lang.ClassCastExceptionの例外: 。研究.Animail、変換インスタンスを研究するためにキャストすることができない変換インスタンスを人間。
研究転移インスタンス.Main.main(Main.java:8)AT。
意気消沈役割
他の方法は、遷移が場合を除き、親クラス・オブジェクトに共通上方B失われる。ダウン再び遷移することができ、この作用は上方遷移に関連して理解されています。