私はJavaを学び、オブジェクト型について質問しています。質問オブジェクトの種類について
例として、以下を取る:
class A { }
class B extends A { }
class C {A myObject = new B();}
myObjectというのタイプを記述するために受け入れられた方法は何ですか?
タイプA、タイプB、またはタイプAおよびタイプBとお考えですか?
ありがとうございました。
私はJavaを学び、オブジェクト型について質問しています。質問オブジェクトの種類について
例として、以下を取る:
class A { }
class B extends A { }
class C {A myObject = new B();}
myObjectというのタイプを記述するために受け入れられた方法は何ですか?
タイプA、タイプB、またはタイプAおよびタイプBとお考えですか?
ありがとうございました。
myObject
は、タイプA
の参照です(変数はA
と宣言されています)。
myObject
で示されるオブジェクト自体のタイプはB
です。インスタンスのタイプはB
です。
これは、文脈と焦点の問題です。 myObject
を他の場所で使用すると、それがクラスB
のインスタンスであることがわからない場合があり、タイプがA
であることのみです。
オブジェクトは「内部に格納されているのではなく、参照によって参照されています」。 –
修正。修正されました。 – Kissaki
タイプはAタイプです。タイプとは操作が可能ですが、Bのインスタンスなので、すべての操作はB方式になります。
myObject
が実行時に宣言されたコンパイル時のタイプAとフィールドであり、それは変数の宣言(またはコンパイル時)タイプとランタイムの間のこの区別型B.
のオブジェクトを参照しますJavaのような静的型付けされた言語で多態性がどのように機能するかを理解する上で重要です。オーバーライドされたメソッドの呼び出しのようなものは、実行時の型、コンパイル時の型による他のもの(オーバーロードされたメソッドや静的なメソッドの呼び出しのようなもの)によって決まります。
一般的に、宣言された型によってオブジェクトでできることが決まりますが、実行時の型によって動作の仕方が決まります。
継承は、 "is a"関係を意味します - サブクラスのインスタンスは、スーパークラスのインスタンスです。あなたの例では、BはAを拡張しているので、BのインスタンスもAのインスタンスです - そのため、キャストせずに新しいBをタイプAの変数に割り当てることができます。
変数myObject
お返事ありがとうございました。今私はこれを理解していると思う。 – codealive
タイプBのあるオブジェクトを参照しますか?どのようなアウトプットを手に入れますか? –