2016-09-19 9 views
0

私はオブジェクトへの参照について多くの疑問を抱いており、それらの動作の仕方は部分的に理解しています。私はまだ彼らにいくつかの疑問を持っています。あるオブジェクトの参照をJavaの他のオブジェクトに割り当てるか?

まず、このステートメントのすべての単語は何を意味していますか?

Box b = new Box();

私はnew Box()は、オブジェクトが作成されますと、オブジェクトへの参照が返されることを知っています。私が間違っていない場合、この参照はbに格納されます。だから、最初のBoxは何ですか?私が読んだことによると、Boxを定義するクラスです。私は確信していません。それは私の次の質問に私をもたらします。私は最初の項はIに声明の中で意味を理解しようとした

はこれを試してみた:

class LOL 
{ 
    public static void main(String args[]) 
    { 
     Box b=new Box(); 
     Cup c=new Cup(); 
     Box f=new Cup(); //***** 
     f.daa(); //Prints Box.daa 
     f.display(); //Prints Cup.display 
     f.disp(); //ERROR! 
    } 
} 
class Box 
{ 
    void display() 
    { 
     System.out.println("Box.display"); 
    } 
    void daa() 
    { 
     System.out.println("Box.daa"); 
    } 
} 
class Cup extends Box 
{ 
    void display() 
    { 
     System.out.println("Cup.display"); 
    } 
    void disp() 
    { 
     System.out.println("Cup.disp"); 
    } 
} 

は何がここで起こっていますか? *****は実際に何をしていますか?作成されたオブジェクトのタイプはCup(私はそうだと思います)だから、なぜf.disp()に電話できないのですか?これの周りに私の頭を包むことはできません。

+0

'Box f = ...'では、 'Box'は変数' f'の型です。つまり、Box型のものへの参照を格納することができ、それにはすべてのサブタイプが含まれます。 –

+0

"最初のボックスは何ですか? Javaは静的で強く型付けされた言語です。これは、すべての変数がコンパイル時に知られている型を持ち、その型(またはサブタイプ、つまりサブクラス)の値をこの変数にアサートできることを意味します。 'Box b'は「bという名前の変数を持っていて、その(静的な)型はBoxです」と言っています。しかし、実行時には、 'b'によって参照されるオブジェクトは' Box'または 'Box'のサブクラス(例えばあなたの例では' Cup')のいずれかになります。 – Turing85

+0

@ Turing85あなたのコメントは答えになるはずです –

答えて

1

Box f = new Cup();は、新しいカップを作成し、Boxという変数fに保存します。以下のコードでは、がBoxであり、そのように扱われていることがわかります。 Boxにはdisp()というメソッドがありませんので、f.disp()を実行することはできません。

Box f...Cup f...に変更するか、fをCupにキャストしてdisp()を呼び出す必要があります。

+0

オブジェクトはカップ型ですが、それ以下のコードは型Boxだと思いますか?だからボックスの内容だけにアクセスできますか? –

+0

あなたは非常に近いです。オブジェクトはCup型でもType型でもあります。これは、CupもBox(BoxはBoxのサブクラス)であるためです。以下のコードはBoxオブジェクトであることを知っているだけなので(Box変数なので)、Boxメンバーにしかアクセスできません – Breeze

+0

ああ、今すぐ取得します。クリアされました!しかし、アップヴォートに十分な担当者がいない:p –

0

オブジェクト指向の概念を理解する必要があります。ここでは、基本的な継承とオーバーライドの概念を適用する必要があります。

  • Cupは、Boxのサブクラスです。
  • Boxは、display()およびの方法を有する。あなたがBoxdisplay()メソッドをオーバーライドしているCup
  • Cup自体のdaa()disp()方法を継承しています。

Box f = new Cup(); 

ここでは、Cupのオブジェクトを作成しているし、それがBox型参照に開催されているCupBoxあるので、これを行うことができます。

f.disp(); 

それはBoxクラスで定義されていないようdisp()方法は、コンパイル時に解決することはできませんので、これはコンパイルエラーになります。

+0

私はこの説明が、ありがとう。 「カップは箱だから」と明確にした –

関連する問題