2016-08-06 8 views
-2

三つのクラス 直接Javaキャスト(obj1 = obj2;

class Flower{} 
class Violet extends Flower{} 
class Gardenia extends Flower{} 

とメインクラスがありますが、問題はどのように実施例G1 = F1のためである。この

class Test{ 
    public static void main(String[] args) { 
     Flower f1 = new Flower(); 
     Flower f2 = new Gardenia(); 
     Violet v = new Violet(); 
     Gardenia g1 = new Gardenia(); 
     Gardenia g2 = new Gardenia(); 
     g1 =f1; 
     f1 = g1; 
     g1=v; 
     v=(Violet)f2; 
     g2=f1; 
     g1=f2; 
    } 

} 

です。異なって書くことができますか?オブジェクト参照を別のオブジェクトに直接割り当てると、混乱します。このコードでは、適切なキャストを行い、何もできない行をコメントします(ClassCastEcxeptionは必要ありません)。例えば、f1=g1;の行では、Flower f1=g1;と言うことができます。

+0

あなたは 'G1 =(ガーデニア)F2を意味しますか;'?あなたが何を求めているのか不明です。 – EJP

+0

私は 'f1 = g1; '、私たちはこのように' Flower f1 = new Gardenia(); 'のように書くことができますか?その後、f1はGardenia()への花型のポインティングのインスタンスになりますか? – lor

答えて

0

f1がスーパークラスFlowerのオブジェクトであり、g1がサブクラスのオブジェクトであるため、g1 = f1を割り当てることができないため、コードをコンパイルできません。あなたが望むなら、反対にすることができます。

Flowerがいくつかのメソッドを持っている場合は、より明確かつ簡単な言語を使用するために、すべてのサブクラスに同じメソッドと、宣言できるメソッドがいくつかあります。したがって、Flowerオブジェクトをガーデニアオブジェクトとして使用しようとすると、Flowerオブジェクトにガーデニアオブジェクトよりも「少ない」物があるため、使用できない特定のメソッドが存在する可能性があります。

私は、例えばhere

EDITのように、あなたが主題についての詳細を読むことをお勧め:あなたの代わりにF1 = G1の花のF1 =新しいガーデニア()を使用することができますし、同じ結果を持っています。場合によって

ここケース:

g1 =f1; //desn't work 
    f1 = g1; // now f1 points to g1 and you can treat the object g1 like a flower object 
    g1=v; // doesn't work 
    v=(Violet)f2; //desn't work 
    g2=f1; //doesn't work, but since now f1 has a Gardenia object, you can make it work doing g2 = (Gardenia) f1 
    g1=f2; //doesn't work 
+0

私はサブクラスのいくつかのメソッドを使用することができないサブクラスインスタンスを保持する 'type'スーパークラスを持つことについて知っています。直接指示が私を混乱させている。私は何が起こるかをよく理解するために、 'Flower f1 = new Gardenia(); 'のような明確な割り当てをしたい。投稿されたコードには、そのようなものはありません。だから私は、それぞれのタイプ(どのインスタンスが指し示すか)の上にあるコードからそれぞれの正しい(直接的な)割り当てを求めています。 – lor

+0

あなたが必要なものがあれば、編集された答えを見てください –

関連する問題