Javaでは、次のように配列を宣言できます
String[] array = new String[10];
int size = array.length;
これは、配列自体がオブジェクトであることを意味しますか?C ++では、配列は単なるポインタであり、メソッドはありません。
if (array instanceof Object) System.out.println("Yes!")
&x、p+iとnew int(42)。
Javaでは、次のように配列を宣言できます
String[] array = new String[10];
int size = array.length;
これは、配列自体がオブジェクトであることを意味しますか?C ++では、配列は単なるポインタであり、メソッドはありません。
if (array instanceof Object) System.out.println("Yes!")
&x、p+iとnew int(42)。
回答:
はい; Java言語仕様は次のように書いています:
Javaプログラミング言語では、配列はオブジェクト(§4.3.1)であり、動的に作成され、Object型(§4.3.2)の変数に割り当てることができます。クラスObjectのすべてのメソッドは、配列で呼び出すことができます。
さて、Javaに聞いてみましょう!
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println(args instanceof Object);
int[] someIntegers = new int[] {42};
System.out.println(someIntegers instanceof Object);
}
}
出力:
true
true
int[] someIntegers = {42};同じ結果を宣言することもできます。
答えは「はい」ですが、厳密に言えば、配列もC ++のオブジェクトです。現在の標準(FDIS)の§1.8[intro.object]から:
オブジェクトは、ストレージの領域です。
私は、配列がリフレクションAPI- java.lang.reflect.Arrayで表現を持つことを追加したいだけです。
java.util.Object(new int[1]) instanceof Object // -> evaluates to true
java.util.Arraysはヘルパークラスであり、配列はこのクラスのインスタンスではありません。(new int[1]) instanceof java.util.Arrays // -> compile error
java.lang.reflect.Arrayはヘルパークラスであり、配列はこのクラスのインスタンスではありません。(new int[1]) instanceof java.lang.reflect.Array // -> compile error
配列はすべてのメンバーを継承します java.lang.Object
配列は、clone()から継承されたメソッドをオーバーライドしますObject。
配列lengthは、配列のコンポーネントの数を含むフィールドを実装します。長さは正またはゼロです。それはあるpublicとfinal。
配列はインターフェイスCloneableとを実装しますjava.io.Serializable。
8a。配列はでサポートされていClass<T>ます。Class<T>配列インスタンスからインスタンスを取得できます
(new int[2]).getClass()
または配列型から
int[].class
8b。一意のリフレクションクラスインスタンス(つまりのインスタンスjava.lang.Class<T>)は、コード内の異なる配列タイプごとに作成されます。例
int[].class.getCanonicalName() // -> "int[]"
String[].class.getCanonicalName() // -> "java.lang.String[]" /
参考文献
Java仕様のセクション4.3.1のオブジェクトから
オブジェクトは、クラスインスタンスまたは配列です。
クラスインスタンスは、クラスインスタンス作成式によって明示的に作成されます。
配列は、配列作成式によって明示的に作成されます。
配列型の直接のスーパークラスはObjectです。
すべての配列タイプは、インターフェースCloneableおよびを実装しますjava.io.Serializable。
配列型のメンバーは次のすべてです。
length配列のコンポーネントの数を含むpublic finalフィールド。長さは正またはゼロです。
publicメソッド。cloneクラス内の同じ名前のメソッドをオーバーライドし、Objectチェックされた例外をスローしません。clone配列型のメソッドの戻り値の型T[]はT[]です。
多次元配列のクローンは浅いです。つまり、単一の新しい配列のみを作成します。サブアレイは共有されます。
クラスObjectから継承されたすべてのメンバー。継承されないObjectの唯一のメソッドは、そのcloneメソッドです。
何かの配列はオブジェクトです。一つは、次のようなメソッドを呼び出すことができequals、hashcodeなど。
final int[] i = {};
i.equals(new int[] {1}); // false
i.hashcode();
ネイティブ型のメソッドを呼び出すことはできません。
以下のコードスニペットと出力を確認してください。
public class Tester {
int a[];
public static void main(String[] args) {
System.out.println(new Tester().a);// null
System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}
}
明らかに配列aはオブジェクトとして扱われます。