58

質問は基本的に自明です。配列のAPIを見つけることができませんでした(この配列以外ですが、これは実際の配列を処理するための静的ヘルパー関数の束を定義するだけです)。そのためのクラスがない場合、これは配列が。になることができないことを示唆しているようObjectです。

ただし、配列にのようなパブリックフィールドと、そのようにlength呼び出すことができるメソッドがあり、(非常に強力に)完全に反対を示唆しているよう.equals()に見えるという事実。.clone()

プリミティブ配列の奇妙な表現と振る舞いの説明は何ですか?

注意として、私は今、配列のメソッドで「Open Implementation」Eclipse機能を使用しようとしました.clone()。このメソッドがどこでどのように定義されているかを確認できることを期待しています(int []がそれを上書きしたため)オブジェクト)、しかしそれは実際に私のEclipse全体がフリーズしてクラッシュする原因になりました...

4

7 に答える 7

68

すべての配列型にクラスがあるので、のクラスがあり、のクラint[]​​スがありFoo[]ます。これらのクラスはJVMによって作成されます。int[].class、でアクセスできますFoo[].class。これらのクラスの直接のスーパークラスはObject.class

public static void main(String[] args)
{
    test(int[].class);
    test(String[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}

コンパイル時のサブタイピングルールもあります。がのサブタイプである場合、はのAサブBタイプA[]ですB[]

于 2012-10-09T20:15:13.070 に答える
28

Java言語仕様はあなたにアイデアを与えるはずです:

配列型の直接のスーパークラスはObjectです。

すべての配列タイプは、インターフェイスCloneableとを実装しますjava.io.Serializable

さらに

オブジェクトは、クラスインスタンスまたは配列です。

したがって、配列はインスタンスではないため、配列を作成するためにコンストラクターは必要ありません。代わりに、配列作成式を使用します。

于 2012-10-09T19:28:05.977 に答える
16

以下のコードを参照してください。コンパイルします:

    int[] arr = new int[2];
    System.out.println(arr.toString());

さて、どのプリミティブ型でも、Objectクラスで定義されたmethod()を呼び出すことはできませんtoString()(または、そのことについてはどのメソッドでも)...したがって、配列は本質的にObject。です。

OK、どうぞ:

JLSセクション4.3から:

参照型には、クラス型(§8)、インターフェース型(§9)、型変数(§4.4)、配列型(§10)の4種類があります。

そして、セクション10

Javaプログラミング言語では、配列はオブジェクト(§4.3.1)であり、動的に作成され、タイプObject(§4.3.2)の変数に割り当てることができます。クラスObjectのすべてのメソッドは、配列で呼び出すことができます。

したがって、最初の引用から、Array実際にはクラスではありません...それは別のタイプです。しかし、本質的に配列はオブジェクトですが、一部Classではありませんが、Array型です。したがって、それらはいくつかのクラスのインスタンスではなく、arrayそのように作成されるように定義されたオブジェクトである可能性があります...

于 2012-10-09T19:15:59.973 に答える
7

短くて単純なので、はい<Type>[]はのタイプですObjectObject私が理解しているように、それは直接拡張されます。その上にはすべてのObjectメソッド、、、toString()...がありhashCode()、さらに。と呼ばれる特別な公開変数がありますlength。このクラスjava.util.Arraysは、配列のタイプを処理するためのユーティリティクラスです。次のようなものを混乱に追加すると、少し混乱します: int[]から継承しませんObject[]。また、他の型とは異なりObject、配列型のコンストラクターはありません。彼らはキーワードを尊重しますnewが、それは通常サイズに割り当てることです。それは少し奇妙ですが、それらの言語の癖の1つにすぎません。

しかし、質問に答えるために、はい、それらはオブジェクトです。

于 2012-10-09T19:15:57.220 に答える
3

配列は、単一の型の値の固定数を保持するコンテナオブジェクトです。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.htmlを参照してください

于 2012-10-09T19:10:37.047 に答える
0

私たちが知っているように、Javaのいくつかのプリミティブ型のみ。基本的に、必要に応じて宣言、構築、初期化など、配列を作成するためのいくつかのステップがまだあります。つまり、配列は実際にオブジェクトです。

さらに深く進むと、プリミティブ型は元の値でメモリに格納できますが、オブジェクトはアドレス(参照)です。したがって、パラドックスを想像することができます。配列がプリミティブ型の場合、元の値をメモリに格納するにはどうすればよいでしょうか。Stringと同じだと思いますが、Stringは最終的なオブジェクトなので、プリミティブ型のように、String s="s"という簡単な方法でオブジェクトを作成できます。

于 2012-10-09T19:49:01.427 に答える
-1

オブジェクトです

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

于 2012-10-09T19:10:25.597 に答える