2010-11-23 14 views
2

私はJavaを学び、オブジェクト型について質問しています。質問オブジェクトの種類について

例として、以下を取る:

class A { } 

class B extends A { } 

class C {A myObject = new B();} 

myObjectというのタイプを記述するために受け入れられた方法は何ですか?

タイプA、タイプB、またはタイプAおよびタイプBとお考えですか?

ありがとうございました。

+0

タイプBのあるオブジェクトを参照しますか?どのようなアウトプットを手に入れますか? –

答えて

6

myObjectは、タイプAの参照です(変数はAと宣言されています)。

myObjectで示されるオブジェクト自体のタイプはBです。インスタンスのタイプはBです。

これは、文脈と焦点の問題です。 myObjectを他の場所で使用すると、それがクラスBのインスタンスであることがわからない場合があり、タイプがAであることのみです。

+0

オブジェクトは「内部に格納されているのではなく、参照によって参照されています」。 –

+0

修正。修正されました。 – Kissaki

1

タイプはAタイプです。タイプとは操作が可能ですが、Bのインスタンスなので、すべての操作はB方式になります。

1

myObjectが実行時に宣言されたコンパイル時のタイプAとフィールドであり、それは変数の宣言(またはコンパイル時)タイプとランタイムの間のこの区別型B.

のオブジェクトを参照しますJavaのような静的型付けされた言語で多態性がどのように機能するかを理解する上で重要です。オーバーライドされたメソッドの呼び出しのようなものは、実行時の型、コンパイル時の型による他のもの(オーバーロードされたメソッドや静的なメソッドの呼び出しのようなもの)によって決まります。

一般的に、宣言された型によってオブジェクトでできることが決まりますが、実行時の型によって動作の仕方が決まります。

0

継承は、 "is a"関係を意味します - サブクラスのインスタンスは、スーパークラスのインスタンスです。あなたの例では、BはAを拡張しているので、BのインスタンスもAのインスタンスです - そのため、キャストせずに新しいBをタイプAの変数に割り当てることができます。

変数myObject

は、タイプAのですが、それは本当にあなたがこれを試してみました

+0

お返事ありがとうございました。今私はこれを理解していると思う。 – codealive