2017-12-31 27 views
0

Kann mir jemand helfen, diesen Code zu verstehen?Warum ist es ein Fehler, dass das x als Objekt betrachtet wird, obwohl es auf ein Array verweist?

int[] A = new int[2]; 
Object x = A; // All references are Objects 
A[0] = 0;  // Static type of A is array... 
x[1] = 1; // But static type of x is not an array: ERROR 

Nach der Oracle Java SE Website:

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

Ich verstehe, dass Arrays Object Typ Variablen zugewiesen werden können, aber meine Verwirrung liegt vielleicht in dem Konzept der Referenz. Wenn wir Object x = A sagen, sagen wir, dass x einen Verweis auf das Array A hat. Meine Verwirrung liegt jedoch in x[1] = 1. Warum ist es ein Fehler, dass die x als Object gilt, obwohl es ein Array referenziert? Denke ich an [] als eine Art von Methode, die nur in der Klasse "Array" zugänglich ist?

+1

Während es wahr ist, dass ein Array ein Objekt ist, sind nicht alle Objekte Arrays. Daher wird der Compiler es Ihnen nicht erlauben, so zu indizieren, als ob es ein Array wäre, wenn es nicht zufällig ist. – Zachary

+2

Sie müssen den Unterschied zwischen Variablentyp und Referenztyp verstehen. Der Compiler weiß nur, dass x ein Objekt ist, nicht mehr und nicht weniger. –

+0

@HovercraftFullOfEels also meinst du, da 'Objekt x' nicht als ein Objekt definiert ist, wird es als eine Variable betrachtet? Wenn ich also "Objekt x = A" definiere, ist dies eine variable Zuweisung im Gegensatz zu einer Referenz? –

Antwort

1

Während ich Typinformation nicht unnötig wegwerfen würde, können Sie Array#setInt(Object, int, int) verwenden, um auf int[] durch eine Object zuzugreifen. Das heißt,

Array.setInt(x, 1, 1); // x[1] = 1; 

würde funktionieren.

-3

In Wirklichkeit sind Sie nur ein primitiver Datentyp, um die Verwendung eines Objekts einzukapseln, das ist etwas falsch.

Etwas, das wäre akzeptabel ist, um tatsächlich an Stelle des Urtyps von der Integer-Klasse zu verwenden und oder sogar eine HashSet von Integer-Typ zu schaffen, wie ist zu erklären, so

HashSet<Integer> numbers = new HashSet<String>(); 

Die Object-Klasse in Wirklichkeit ist etwas ganz besonderes, es erlaubt Ihnen, Objekttyp Variablen zu erstellen und Sie können ein Array vom Typ Object, wie Sie es für alle primitiven Datentyp

Object[] obj; 

im Gegensatz zu C erklären, Java haben keinen klaren Kontakt mit dem Array durch ein Zeiger stattdessen es wird der Speicherort von im Heap-Speicher des Objekts als dann verwendet werden können.

+1

Ich denke, du hast die Frage falsch verstanden. – bcsb1001

1

arrays are objects - Dies bedeutet, dass Array für einen beliebigen Typ (Referenz oder Primitiv) die Kindklasse für die Objektklasse ist.

  • Durch Verwendung der übergeordneten Referenzinstanz der Kindklasse kann zugegriffen werden. Daher ist die Anweisung Object x = A; syntaktisch korrekt.
  • Durch die Verwendung der Child-Referenz kann auf untergeordnete Methoden/Implementierungen zugegriffen werden. Daher ist die Anweisung A[0] = 0; syntaktisch korrekt.
  • Durch Verwendung der Elternreferenz kann auf untergeordnete Methoden/Implementierungen nicht zugegriffen werden. Daher ist die Anweisung x[1] = 1; syntaktisch falsch.
+0

Also kann ich im Sinne von "Da' x' nicht den statischen Typ von Array haben, deshalb ist 'x [1] = 1 'falsch, weil' [] 'nur funktioniert, wenn der dynamische Typ Array ist?" –

+0

Ich sage, dass ~ x ~ das ~ [] ~ Symbol nicht kennt. Durch die Verwendung von Cast-Conversions oder die Verwendung von java.util.Array-Methoden können Sie den Array-Typ festlegen. – Nithin

Verwandte Themen