質問は基本的に自明です。配列用のAPIを見つけることができませんでした(これ以外 Arrays ですが、これは実際の配列を処理するための静的ヘルパー関数の束を定義するだけです)。クラスがない場合、これは配列がObject
にできないことを示唆しているようです。
ただし、配列にはlength
のようなパブリックフィールドと、.equals()
や.clone()
のように呼び出すことができるメソッドがあるという事実は、完全に反対を示唆しているようです。
プリミティブ配列の奇妙な表現と動作の説明は何ですか?
注として、私は配列の.clone()
メソッドで「Open Implementation」Eclipse機能を使用しようとしました。 int []はObjectからオーバーライドしたと言いましたが、実際にはEclipse全体がフリーズしてクラッシュしました...
すべての配列タイプにクラスがあるため、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[]
のサブタイプである場合、コンパイル時のサブタイプ規則もあります。
Java Language Specification からアイデアが得られます。
配列型の直接のスーパークラスはObjectです。
すべての配列タイプは、インターフェース
Cloneable
およびJava.io.Serializable
を実装します。
さらに :
オブジェクトは、クラスインスタンスまたは配列です。
したがって、配列はインスタンスではないため、配列を作成するためにコンストラクタは必要ありません。代わりに Array Creation Expressions を使用します。
以下のコードを参照してください。コンパイルします:-
_ 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
のオブジェクトである可能性があり、そのように作成されるように定義されています。
短く簡単です。はい、<Type> []はObject
の型です。私が理解するように、それはObject
から直接拡張します。 toString()
、hashCode()
、...に加えて、length
と呼ばれる特別な公開変数があります。クラスJava.util.Arrays
は、配列のタイプを処理するためのユーティリティクラスです。次のような混乱に追加すると、少し混乱します。int[]
はObject[]
を継承しません。また、他のObject
型とは異なり、配列型のコンストラクターはありません。それらはnew
キーワードを尊重しますが、通常はサイズに割り当てます。それは少し奇妙ですが、それらの言語の癖の1つにすぎません。
質問に答えるために、はい、彼らはオブジェクトです。
配列は、単一の型の値の固定数を保持するコンテナオブジェクトです。
http://docs.Oracle.com/javase/tutorial/Java/nutsandbolts/arrays.html を参照してください
Javaでわかっているように、基本的には、declare、constructなどの配列を作成するいくつかの手順があります。 または必要に応じて初期化します。これは、配列が実際にオブジェクトであることを意味します。
さらに深く進むと、プリミティブ型は元の値でメモリに格納できますが、オブジェクトはアドレス(参照)です。逆説を想像できますが、配列がプリミティブ型である場合、どのように元の値をメモリに保存できますか? Stringと同じと思いますが、Stringは最終オブジェクトなので、プリミティブ型のようにString s = "s"という簡単な方法でオブジェクトを構築できます。