2016-10-17 10 views
0
 public class A 
    { 

     public void printA(){ 
     System.out.println("A"); 
     } 

    } 


    public class B extends A 
    { 
     public void printB(){ 
     System.out.println("B"); 
     } 

    } 

    public class C extends B 
    { 
     public void printC(){ 
     System.out.println("C"); 
     } 

    } 

    public class test { 
     public static void main(String[] args) 
     { 

    A a = new B(); 
      a.printA(); // work 

     B b = (B) a; 
      b.printB(); // work 

      C c = (C) b; 
      c.printC(); // not work throw java.lang.ClassCastException 

     } 
} 

私は三つのクラスのAを持っており、BとC
CがBから延び、ダウンAからBに仕事をキャスト、およびそれらの間の関係が、BからCに動作しない理由Bは
から延びAとBのように、BはCの親ですので、JVMはどのように動作しますか?間接的なサブクラスへのキャスティングは機能しませんか?

+1

は、あなたがオブジェクトのクラスを変更することはできません、あなただけの参照のクラスを変更することができます。 –

+0

私はどこで私のコードでオブジェクトのクラスを変更しようとしているのですか? –

+0

'(C)b'を実行すると、これがオブジェクトの型を' C'に変更するふりをしようとしていますが、そうではありません。オブジェクトの型は常に 'B'です。 –

答えて

6

クラスは、その親クラスにのみキャストすることができます。それらのクラスは、そのサブクラスについての知識がありません。

オブジェクトがBのインスタンスであるため、Cのメソッドは実装されていません。

これは動作します:

A a = new C(); 
    a.printA(); // work 

    B b = (B) a; 
    b.printB(); // work 

    C c = (C) b; 
    c.printC(); // work 
+0

あなたはなぜこの仕事をより詳細に説明できますか? –

+0

クラスは親クラスにのみキャストできますが、子クラスにはキャストできません。クラスはサブクラスについて何も知らないので。 – maxpovver

+0

説明をありがとう –

関連する問題