Javaでは、Objectはランタイムタイプ(作成されたもの)とキャストタイプ(キャストされたタイプ)を持つことができます。
これらのタイプの固有名は何だろうかと思います。例えば
class A {
}
class B extends A {
}
A a = new B();
aはとして作成されましたが、Bとして宣言されましたA。aそれぞれの視点を使うタイプを参照する適切な方法は何ですか?
Javaでは、Objectはランタイムタイプ(作成されたもの)とキャストタイプ(キャストされたタイプ)を持つことができます。
これらのタイプの固有名は何だろうかと思います。例えば
class A {
}
class B extends A {
}
A a = new B();
aはとして作成されましたが、Bとして宣言されましたA。aそれぞれの視点を使うタイプを参照する適切な方法は何ですか?
オブジェクト(実行時に存在し、実行時型のみを持つ)とコンパイル時型を持つ式(変数など)を区別することが重要だと思います。
したがって、この場合:
A a = new B();
aは型の変数ですA。実行時の値は、タイプのオブジェクトへの参照Bです。
Java言語仕様では、オブジェクトのタイプに「ランタイムクラス」(たとえば、セクション15.12.4.4のようにオーバーライドする目的で)を使用します。他の場所では、式の型に「type」、つまりコンパイル時の型を使用しているだけだと思います。
Java言語仕様では、変数の宣言された型getClass()、オブジェクトのランタイムクラスについてのjavadocについて説明しています。
Javaにはランタイムタイプのようなものはないことに注意してください。List<String>とList<Integer>は異なるタイプですが、それらのインスタンスは同じランタイムクラスを共有します。
この場合、Aは参照タイプでBあり、はインスタンスタイプです。
変数/参照のタイプとオブジェクトのタイプを区別すると言えます。その場合
A a = new B();
変数/参照は型ですAが、オブジェクトは型Bです。
変数のタイプaはですA。これは参照であるため、変更はありません。たまたまタイプのオブジェクトを参照していますB。参照を通じてそのBオブジェクトを参照している間Aは、それがタイプであるかのようにしか扱うことができませんA。
後でそれをより具体的なタイプにキャストできます
B b = (B)a;
Bそのオブジェクトのメソッドを使用します。
探している用語は、見かけのタイプと実際のタイプです。
A a = new B();
コンパイラはオブジェクトがタイプAであることしか認識していないため、見かけのタイプはAです。そのため、現時点では、B固有のメソッドを参照することはできません。
実際のタイプはBです。B固有のメソッドにアクセスするために、オブジェクトをキャストする(つまり、見かけのタイプを変更する)ことができます。
a使用できるクラスのオブジェクト を判別するには、次のようにします。
/*The java.lang.Object.getClass() method returns the runtime class of an object*/
System.out.println("a is object of: "+a.getClass());
セクション15.5。式と実行時チェックは、を区別します
例えば、
式の型が参照型である場合、参照されるオブジェクトのクラス、または値がnullではなくオブジェクトへの参照であるかどうかでさえ、コンパイル時に必ずしも既知であるとは限りません。Javaプログラミング言語には、参照されるオブジェクトの実際のクラスが、式のタイプから推測できない方法でプログラムの実行に影響を与える場所がいくつかあります。
[をちょきちょきと切る]
タイプが参照型である式は、式の実行時の値によって参照されるオブジェクト
instanceofのクラスかどうかを確認するためにを使用してテストでき ます。
したがって、上記の言語をに適用する
A a = new B();
私たちは次のようなことを言うかもしれません
に格納されている値がランタイムクラスのオブジェクトへの参照で
aあるAにもかかわらず、式の静的型はです。aB
個人的に、私は2つの概念を次のように解釈します(ただし、その正確性については確信が持てないことに注意してください)。