1

Javaでは、Objectはランタイムタイプ(作成されたもの)とキャストタイプ(キャストされたタイプ)を持つことができます。

これらのタイプの固有名は何だろうかと思います。例えば

class A {

}

class B extends A {

}

A a = new B();

aはとして作成されましたが、Bとして宣言されましたAaそれぞれの視点を使うタイプを参照する適切な方法は何ですか?

4

8 に答える 8

10

オブジェクト(実行時に存在し、実行時型のみを持つ)とコンパイル時型を持つ(変数など)を区別することが重要だと思います。

したがって、この場合:

A a = new B();

aは型の変数ですA。実行時の値は、タイプのオブジェクトへの参照Bです。

Java言語仕様では、オブジェクトのタイプに「ランタイムクラス」(たとえば、セクション15.12.4.4のようにオーバーライドする目的で)を使用します。他の場所では、式の型に「type」、つまりコンパイル時の型を使用しているだけだと思います。

于 2009-10-03T16:53:35.050 に答える
5

Java言語仕様では、変数の宣言された型getClass()、オブジェクトのランタイムクラスについてのjavadocについて説明しています。

Javaにはランタイムタイプのようなものはないことに注意してください。List<String>List<Integer>は異なるタイプですが、それらのインスタンスは同じランタイムクラスを共有します。

于 2009-10-03T16:46:15.320 に答える
2

この場合、A参照タイプでBあり、はインスタンスタイプです。

于 2009-10-03T16:45:40.260 に答える
1

変数/参照のタイプとオブジェクトのタイプを区別すると言えます。その場合

A a = new B();

変数/参照は型ですAが、オブジェクトは型Bです。

于 2009-10-03T16:40:49.433 に答える
1

変数のタイプaはですA。これは参照であるため、変更はありません。たまたまタイプのオブジェクトを参照していますB。参照を通じてそのBオブジェクトを参照している間Aは、それがタイプであるかのようにしか扱うことができませんA

後でそれをより具体的なタイプにキャストできます

B b = (B)a;

Bそのオブジェクトのメソッドを使用します。

于 2009-10-03T16:41:31.283 に答える
0

探している用語は、見かけのタイプ実際のタイプです。

A a = new B();

コンパイラはオブジェクトがタイプAであることしか認識していないため、見かけのタイプはAです。そのため、現時点では、B固有のメソッドを参照することはできません。

実際のタイプはBです。B固有のメソッドにアクセスするために、オブジェクトをキャストする(つまり、見かけのタイプを変更する)ことができます。

于 2009-10-03T16:47:54.547 に答える
0

a使用できるクラスのオブジェクト を判別するには、次のようにします。

/*The java.lang.Object.getClass() method returns the runtime class of an object*/   
System.out.println("a is object of: "+a.getClass());
于 2018-01-11T03:52:25.430 に答える
0

セクション15.5。式と実行時チェックは、を区別します

  • 式のタイプ
  • 参照されるオブジェクトのクラス

例えば、

式の型が参照型である場合、参照されるオブジェクトのクラス、または値がnullではなくオブジェクトへの参照であるかどうかでさえ、コンパイル時に必ずしも既知であるとは限りません。Javaプログラミング言語には、参照されるオブジェクトの実際のクラスが、式のタイプから推測できない方法でプログラムの実行に影響を与える場所がいくつかあります。

[をちょきちょきと切る]

タイプが参照型であるは、式の実行時の値によって参照されるオブジェクトinstanceofのクラスかどうかを確認するためにを使用してテストでき ます。

したがって、上記の言語をに適用する

A a = new B();

私たちは次のようなことを言うかもしれません

に格納されている値がランタイムクラスのオブジェクトへの参照でaあるAにもかかわらず、式の静的型はです。aB

個人的に、私は2つの概念を次のように解釈します(ただし、その正確性については確信が持てないことに注意してください)。

  • 式の静的型は、Javaコンパイラで処理するためにコンパイル時にソースコードに存在する純粋な構文概念です。
  • オブジェクトのランタイムクラスは、Java仮想マシンで処理するために実行時にマシンメモリに存在する実際のマシン構造です。
于 2019-12-29T00:30:11.333 に答える