2017-04-05 9 views
1

プリントアウトがある:フルーツ アップル ゴールデン 私はオブジェクトc.make()class Goldenでメソッドを呼び出しますなぜ私はcが対象であることを考える代わりにclass Apple .Becauseのかを知りたいJavaの意気消沈したオブジェクトを呼び出すサブ方法

ゴールデンクラスのApple、私の間違いはどこですか?ご検討いただきありがとうございます。

public class Fruit { 
    public Fruit(){ 
     System.out.println("Fruit"); 
    } 
    public void make(){ 
     System.out.println("Fruit"); 
    } 

} 
class Apple extends Fruit{ 
    public Apple(){ 
     System.out.println("Apple"); 
    } 
    public void make(){ 
     System.out.println("Apple"); 
    } 
} 
class Golden extends Apple{ 
    public Golden(){ 
     System.out.println("Golden"); 
    } 
    public void make(){ 
     System.out.println("Golden"); 
    } 
} 
public class tet { 

     public static void main(String[] args){    
      Fruit b = new Golden();//Fruit Apple Golden 
      Apple c = (Apple)b;             
      c.make();    
     } 



} 
+0

それを 'Apple'にキャストしても、まだ' Golden'型のオブジェクトであり、 'make'メソッドがオーバーライドされているので、' Golden'クラスのものが呼び出されます。 – BackSlash

+0

(Apple)bが表示されたら、スタックとヒープはどうなりますか?ヒープを指すbの方向を含め、何も起こりませんか? –

+0

非常にシンプルにする**ルール1 ** 'new'演算子を使用するクラスのヒープ' object'が作成されます。 **ルール2 ** 'new'を使用したクラスの参照と、そのクラスの上位階層のすべての' class and interfaces'は、作成されたObjectのみを参照することができます。 *注*猫の犬の参照は無効です。動物の犬の参照は、犬の吠える能力を取り除くものではありません。 :) –

答えて

2

いいえ、cbと同じです。実際には、同じ正確なオブジェクトを指します。タイプはGoldenです。 Apple参照でオブジェクトを「表示」するだけですが、実際のタイプは変更されません。

+0

'(アップル)b'が現れたら、スタックとヒープはどうなりますか?ヒープを指すbの方向を含め、何も起こりませんか? –

+0

'javap'を使って生成されたバイトコードを見ることができますが、スーパークラス参照を使ってサブクラスを指すことについては特別なことは何もありません。 'List <> list = new ArrayList <>();'と同じように、あなたは 'List'というインターフェースのインスタンスが突然存在するとは思わないでしょう。 – Kayaman

関連する問題