7

クラスがあるとしましょう:

class Class1
{
   int i = 1;
}

そして変数があります:

Class1 ob1 = new Class1();
  • 変数に格納された参照自体はob1、オブジェクトを参照する情報を格納しますClass1か?
  • 格納されているヒープの部分には、Class1それが型であるという情報が格納されていClass1ますか?
  • この情報は論理的にどのように見えますか? application1.Class1 のような文字列か、いくつかの参照型プールへの参照ですか?

そのような情報のソースをお勧めできる場合は、参考書で見つけることができないので、それを提供していただきありがとうございます.

4

4 に答える 4

1

すべての Java オブジェクト参照は、実行時にそのクラスを認識しています。このいわゆる「ランタイム型情報」は、次のようなコードで使用されます。

if (obj instanceof class1) {
  // true!
}

からオブジェクトのクラスにアクセスすることもできますobj.getClass()class1.classこれは、クラスのオブジェクトを返しますClass<class1>Object.getClassメソッドを参照してください。

(クラスが のようにパラメータ化されている場合、「消去」によりclass1<T>、 の型はT実行時に保存されないことに注意してください。)

クラス情報がポインタと一緒に保存されているのか、データと一緒に保存されているのかわかりません。おそらくjvmの実装固有です。しかし、実用的な観点からはほとんど問題になりません。(したがって、答え 1 または 2、あるいはその両方が「はい」です)。

3 に対する答えは、Java プログラマに関する限り、実行時の型情報は class のオブジェクトにカプセル化されているということですClass。内部では、JVM が何らかの方法でこれを実装している可能性があります。

于 2013-06-26T06:07:46.183 に答える
1

変数ob1に格納された参照自体は、Class1のオブジェクトを参照しているという情報を格納していますか?

いいえ。参照変数ob1は、それが指すオブジェクトの参照のみを格納します。そして、そのオブジェクトに関する情報は、アプリケーション (または JVM) に既に認識されています。

Class1 が格納されているヒープの部分には、Class1 型であるという情報が格納されていますか?

いいえ。ロード中のクラスに関する情報は、メソッド領域に格納されます。このリンクで指定されて
いるように、ロードする型ごとに、Java 仮想マシンは次の種類の情報をメソッド領域に格納する必要があります。

  • タイプの完全修飾名
  • 型の直接のスーパークラスの完全修飾名 (型がインターフェースまたはクラス java.lang.Object であり、どちらもスーパークラスを持たない場合を除く)
  • 型がクラスまたはインターフェイスであるかどうか
  • 型の修飾子 (`public、abstract、final の一部のサブセット)
  • 直接スーパーインターフェースの完全修飾名の順序付きリスト

この情報は論理的にどのように見えますか? application1.Class1 のような文字列か、いくつかの参照型プールへの参照ですか?

Java クラス ファイルと Java 仮想マシン内では、型名は常に完全修飾名として格納されます。たとえば、パッケージ java.lang 内のクラス Object の完全修飾名は、java/lang/Objectとして表されます。メソッド領域では、設計者が選択した形式とデータ構造で完全修飾名を表すことができます。

于 2013-06-26T08:31:11.553 に答える
1

あなたの質問に答える:

  1. いいえ、そうではありません。参照は単なる参照です。つまり、対応するオブジェクトが格納されているヒープ内のアドレスです。実際には、参照アドレスを含む実際の変数はさまざまなクラス型である可能性があるため、参照型に関する重複した情報を参照自体に格納する必要はありません。

  2. 非常に奇妙な質問です。もちろん、そうです。さらに、この「ヒープの一部」は、この特定のクラス記述を含むオブジェクトです。すべてのオブジェクトには、そのクラスの完全な名前Classに関する情報が含まれており、それによって記述されます。

  3. その構造を意味する場合、論理的にどのように見えるかとして定義されていません。

2.7 オブジェクトの表現:

Java 仮想マシンは、オブジェクトの特定の内部構造を強制しません。

しかし、クラス タイプに関する情報について話している場合は、Stringオブジェクトの「タイプ」Class(それが表す) は対応するクラスの名前にすぎないため、それは単なるオブジェクトです。

于 2013-06-26T06:35:05.473 に答える
0

ここに画像の説明を入力

これは、JVM が を使用して実行時にチェックするクラスの情報を格納できるスキームの 1 つですinstanceOf

すべての Java 仮想マシンには、オブジェクトへの参照のみが与えられた場合に、そのクラスに関する情報を判別する機能が必要です。これは、タイプ セーフなキャストや instanceof 演算子など、さまざまな理由で必要になります。

これは、Java 仮想マシンの実装がクラス情報をオブジェクトのインスタンス データに関連付ける 1 つの方法です。この図では、クラス情報を含むデータ構造へのネイティブ ポインターが、オブジェクトのインスタンス変数と共に格納されています。JVM がオブジェクトのデータをそのクラス情報に接続するさまざまな方法の詳細については、この記事の範囲を超えています。ここで理解しておくべき重要なことは、クラス情報が何らかの方法でオブジェクトのインスタンス データに関連付けられること、およびインスタンス データにはオブジェクトのクラスとそのすべてのスーパークラスのフィールドが含まれることです。

オブジェクトの初期化に関する Artima の投稿

instanceOfしたがって、クラスに関する情報を確認するときは、このポインターを介してアクセスします。ただし、クラス情報の保存に関する正確な実装は、実装固有である可能性があることに注意してください。

于 2013-06-26T06:31:05.260 に答える