配列はJavaのオブジェクトですか


93

Javaでは、次のように配列を宣言できます

String[] array = new String[10]; 
int size = array.length; 

これは、配列自体がオブジェクトであることを意味しますか?C ++では、配列は単なるポインタであり、メソッドはありません。


5
いいえ、C ++では、配列は配列であり、配列ではありません。
Kerrek SB、2012

42
if (array instanceof Object) System.out.println("Yes!")
スカフマン、2012年

6
ああ、C ++では、配列とポインタの両方がオブジェクトです。
R.マルティーニョフェルナンデス

2
@ R.MartinhoFernandesすべてのC ++配列は確かにC ++オブジェクトですが、C ++オブジェクトではないC ++ポインター、つまり右辺値の評価結果であるすべてのポインターがあります。例としては&xp+inew int(42)
fredoverflow 2012年

1
@skaffman他の方法ではコンパイルされないため、メッセージは厳密には必要ありません。
shmosel

回答:



60

はい; Java言語仕様は次のように書いています

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


配列がオブジェクトの場合、それがクラスのインスタンスであることを意味しませんか?もしそうなら、そのクラスを拡張できますか?
One Two Three

9
いいえ、それはしていません:Javaの仕様書き込みを:。。「オブジェクトがクラスのインスタンスまたは配列であるクラスのインスタンスを明示的クラスインスタンス生成式(15.9)によって作成されたアン・アレイは、明示的に配列生成式によって作成されます(§15.10)。そして、いいえ。extends 句 ClassTypeを備えている必要があるため、配列を拡張することはできません。
メリトン2013

36

さて、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

1
int[] someIntegers = {42};同じ結果を宣言することもできます。
Holger

7

はい、Javaのオブジェクトです。

また、この場合array.length、メソッドを呼び出すのではなく、配列のlengthフィールドにアクセスするだけです。Arraysクラスには多くの静的メソッドがあります。


3

Javaの配列には、オブジェクトと共有しない独自のバイトコードがあることに注意することが重要です。それらは確かにオブジェクトですが、低レベルでは少し異なります。


2

答えは「はい」ですが、厳密に言えば、配列もC ++のオブジェクトです。現在の標準(FDIS)の§1.8[intro.object]から:

オブジェクトは、ストレージの領域です。



1

javaのすべての配列は、オブジェクトex int [] a = new int [2]です。そのため、オブジェクトの作成にはnewを使用し、オブジェクトなので、a.getClass()。getName();を使用してクラス名を確認できます。


1
  1. 配列はクラスツリーにリストされているクラスのインスタンスではありませんが、各配列はオブジェクトであり、 java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. クラスjava.util.Arraysはヘルパークラスであり、配列はこのクラスのインスタンスではありません。
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. クラスjava.lang.reflect.Arrayはヘルパークラスであり、配列はこのクラスのインスタンスではありません。
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. 配列はすべてのメンバーを継承します java.lang.Object

  2. 配列は、clone()から継承されたメソッドをオーバーライドしますObject

  3. 配列lengthは、配列のコンポーネントの数を含むフィールドを実装します。長さは正またはゼロです。それはあるpublicfinal

  4. 配列はインターフェイス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[]" /
  1. 繰り返します:配列はオブジェクトですが、クラスツリーのクラスのインスタンスではありません。

参考文献

Java仕様のセクション4.3.1のオブジェクトから

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

  • クラスインスタンスは、クラスインスタンス作成式によって明示的に作成されます。

  • 配列は、配列作成式によって明示的に作成されます。

java.util.Arraysから

  • このクラスには、配列を操作するためのさまざまなメソッド(ソートや検索など)が含まれています

java.lang.reflect.Arrayから

  • Arrayクラスは、Java配列を動的に作成してアクセスするための静的メソッドを提供します。

セクション10.1オブジェクトから

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

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

セクション10.7から配列メンバー

配列型のメンバーは次のすべてです。

  • length配列のコンポーネントの数を含むpublic finalフィールド。長さは正またはゼロです。

  • publicメソッド。cloneクラス内の同じ名前のメソッドをオーバーライドし、Objectチェックされた例外をスローしません。clone配列型のメソッドの戻り値の型T[]T[]です。

  • 多次元配列のクローンは浅いです。つまり、単一の新しい配列のみを作成します。サブアレイは共有されます。

  • クラスObjectから継承されたすべてのメンバー。継承されないObjectの唯一のメソッドは、そのcloneメソッドです。


1

何かの配列はオブジェクトです。一つは、次のようなメソッドを呼び出すことができequalshashcodeなど。

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

ネイティブ型のメソッドを呼び出すことはできません。


0

以下のコードスニペットと出力を確認してください。

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はオブジェクトとして扱われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.