web-dev-qa-db-ja.com

配列はプリミティブ型ですか、それともオブジェクト(または他の何か)ですか?

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

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

プリミティブ配列の奇妙な表現と動作の説明は何ですか?

注として、私は配列の.clone()メソッドで「Open Implementation」Eclipse機能を使用しようとしました。 int []はObjectからオーバーライドしたと言いましたが、実際にはEclipse全体がフリーズしてクラッシュしました...

52
asteri

すべての配列タイプにクラスがあるため、int[]にクラスがあり、Foo[]にクラスがあります。これらのクラスはJVMによって作成されます。 int[].classFoo[].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);
}

ABのサブタイプである場合、A[]B[]のサブタイプである場合、コンパイル時のサブタイプ規則もあります。

60
irreputable

Java Language Specification からアイデアが得られます。

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

すべての配列タイプは、インターフェースCloneableおよびJava.io.Serializableを実装します。

さらに

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

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

27
Baz

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

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

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

OK、ここに行きます:-

JLSセクション4. から:-

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

そして、 セクション1 :-

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

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

14
Rohit Jain

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

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

7
Greg Giacovelli

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

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

3
Aleksandr M

Javaでわかっているように、基本的には、declare、constructなどの配列を作成するいくつかの手順があります。 または必要に応じて初期化します。これは、配列が実際にオブジェクトであることを意味します。

さらに深く進むと、プリミティブ型は元の値でメモリに格納できますが、オブジェクトはアドレス(参照)です。逆説を想像できますが、配列がプリミティブ型である場合、どのように元の値をメモリに保存できますか? Stringと同じと思いますが、Stringは最終オブジェクトなので、プリミティブ型のようにString s = "s"という簡単な方法でオブジェクトを構築できます。

0
Eric