Ist ein Array ein Objekt in Java?

93

In Java können wir ein Array wie deklarieren

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

Bedeutet dies, dass das Array selbst ein Objekt ist? Denn in C ++ ist ein Array nur ein Zeiger und hat keine Methoden.

Mike G.
quelle
5
Nein, in C ++ ist ein Array ein Array und kein Array.
Kerrek SB
42
if (array instanceof Object) System.out.println("Yes!")
Skaffman
6
Oh, und in C ++ sind sowohl Arrays als auch Zeiger Objekte.
R. Martinho Fernandes
2
@ R.MartinhoFernandes Alle C ++ - Arrays sind zwar C ++ - Objekte, aber es gibt C ++ - Zeiger, die keine C ++ - Objekte sind, nämlich alle Zeiger, die das Ergebnis der Auswertung eines r-Werts sind. Beispiele hierfür sind &x, p+iund new int(42).
Fredoverflow
1
@skaffman Die Nachricht ist nicht unbedingt erforderlich, da sie sonst nicht kompiliert würde.
Shmosel

Antworten:

197

Ja.

Der Abschnitt 4.3.1 der Java-Sprachspezifikation beginnt mit:

Ein Objekt ist eine Klasseninstanz oder ein Array.

Paul
quelle
4
Bisher habe ich immer angenommen, dass ein Objekt gleichbedeutend mit einer Klasseninstanz ist und dass Arrays eine spezielle Sprachfunktion sind oder so.
Ruben9922
Ausführliche Erklärung ist hier gegeben: geeksforgeeks.org/array-primitive-type-object-java
Granat
60

Ja; Die Java-Sprachspezifikation schreibt :

In der Programmiersprache Java sind Arrays Objekte (§4.3.1), werden dynamisch erstellt und können Variablen vom Typ Object (§4.3.2) zugewiesen werden. Alle Methoden der Klasse Object können in einem Array aufgerufen werden.

Meriton
quelle
Wenn Array ein Objekt ist, heißt das nicht, dass es eine Instanz einer Klasse ist? Wenn ja, kann ich diese Klasse erweitern?
Eins Zwei Drei
9
Nein, das tut es nicht: Die Java-Spezifikation schreibt : "Ein Objekt ist eine Klasseninstanz oder ein Array. Eine Klasseninstanz wird explizit durch einen Ausdruck zur Erstellung einer Klasseninstanz erstellt (§15.9). Ein Array wird explizit durch einen Ausdruck zur Erstellung eines Arrays erstellt (§15.10). ". Und nein, man kann nicht ein Array erweitern, weil die Klausel erstreckt muss eine Classtype verfügen.
Meriton
36

Fragen wir 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);
  }
}

Ausgabe:

true
true
Nasukkin
quelle
1
Sie können auch int[] someIntegers = {42};das gleiche Ergebnis deklarieren .
Holger
7

Ja, es ist ein Objekt in Java.

Beachten Sie außerdem, dass Sie in diesem array.lengthFall keine Methoden aufrufen, sondern nur auf das Feld des Arrays zugreifen length. In der Arrays- Klasse gibt es viele statische Methoden .

Marsellus Wallace
quelle
3

Es ist wichtig zu beachten, dass Arrays in Java ihre eigenen Bytecodes haben, die sie nicht mit Objekten teilen. Sie sind sicherlich Objekte, werden aber auf niedriger Ebene etwas anders gehandhabt.

ed209
quelle
2

Ich würde sagen, die Antwort lautet ja, obwohl ich hinzufügen könnte, dass ein Array genau genommen auch in C ++ ein Objekt ist. Aus §1.8 [intro.object] des aktuellen Standards (FDIS):

Ein Objekt ist ein Speicherbereich.

Björn Pollex
quelle
1

Jedes Array in Java ist ein Objekt ex int [] a = new int [2]; So wird new verwendet, um ein Objekt zu erstellen, und da es sich um ein Objekt handelt, können wir den Klassennamen nur mit a.getClass () überprüfen. GetName ();

Manoj Mohanty
quelle
1
  1. Ein Array ist keine Instanz einer im Klassenbaum aufgelisteten Klasse. Jedes Array ist jedoch ein Objekt und erbt direkt von java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Die Klasse java.util.Arraysist eine Hilfsklasse, und Arrays sind keine Instanzen dieser Klasse.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Die Klasse java.lang.reflect.Arrayist eine Hilfsklasse, und Arrays sind keine Instanzen dieser Klasse.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Arrays erben alle Mitglieder von java.lang.Object

  2. Arrays überschreiben die von clone()geerbte Methode Object.

  3. Arrays implementieren das Feld length, das die Anzahl der Komponenten des Arrays enthält. Länge kann positiv oder Null sein. Es ist publicund final.

  4. Arrays implementieren die Schnittstellen Cloneableund java.io.Serializable.

8a. Arrays werden unterstützt von Class<T>. Sie können die Class<T>Instanz von einer Array-Instanz abrufen

(new int[2]).getClass()

oder von einem Array-Typ

int[].class

8b. java.lang.Class<T>Für jeden Array-Typ in Ihrem Code wird eine eindeutige Reflexionsklasseninstanz (dh eine Instanz von ) erstellt. Beispiele

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Um es zu wiederholen: Arrays sind Objekte, aber keine Instanzen einer Klasse im Klassenbaum.

VERWEISE

Aus der Java-Spezifikation Abschnitt 4.3.1 Objekte

  • Ein Objekt ist eine Klasseninstanz oder ein Array.

  • Eine Klasseninstanz wird explizit durch einen Ausdruck zur Erstellung einer Klasseninstanz erstellt.

  • Ein Array wird explizit durch einen Arrayerstellungsausdruck erstellt.

Von java.util.Arrays

  • Diese Klasse enthält verschiedene Methoden zum Bearbeiten von Arrays (z. B. Sortieren und Suchen).

Von java.lang.reflect.Array

  • Die Array-Klasse bietet statische Methoden zum dynamischen Erstellen und Zugreifen auf Java-Arrays.

Ab Abschnitt 10.1 Objekte

  • Die direkte Oberklasse eines Array-Typs ist Object.

  • Jeder Array-Typ implementiert die Schnittstellen Cloneableund java.io.Serializable.

Ab Abschnitt 10.7 Array-Mitglieder

Die Mitglieder eines Array-Typs sind alle die folgenden:

  • Das öffentliche letzte Feld length, das die Anzahl der Komponenten des Arrays enthält. Länge kann positiv oder Null sein.

  • Die öffentliche Methode clone, die die gleichnamige Methode in der Klasse überschreibt Objectund keine geprüften Ausnahmen auslöst. Der Rückgabetyp der cloneMethode eines Array-Typs T[]ist T[].

  • Ein Klon eines mehrdimensionalen Arrays ist flach, dh es wird nur ein einziges neues Array erstellt. Subarrays werden gemeinsam genutzt.

  • Alle von der Klasse Object geerbten Mitglieder; Die einzige Methode von Object, die nicht vererbt wird, ist die Klonmethode.

RFS
quelle
1

Arrays von irgendetwas sind Objekte. Man kann Methoden aufrufen , wie equals, hashcodeetc:

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

Man kann keine Methoden für einen nativen Typ aufrufen.

fastcodejava
quelle
0

Beachten Sie das folgende Code-Snippet und die Ausgabe.

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)
}

}}

Array a wird eindeutig als Objekt behandelt.

Vishnu Dahatonde
quelle