2010-03-22 4 views
6

In welcher Klasse ist das Feld length in Java definiert (z. B. für Array-Länge)? Kann ich es in Klasse Object definiert definiert sehen?Punktlänge in Java - Definition finden

EDIT: Warum wurde dieses Feld so entworfen (irgendetwas mit Sicherheit oder Speichereffizienz verbunden)?

+0

Sprechen wir Stringlänge, Arraylänge, Objektgröße oder was? –

+0

@Jason: Ich denke, er spricht über die Arrays. – missingfaktor

+0

@Jason, ich denke, er spricht über array.length, String hat keine Längenvariable, es hat length() -Methode (was verwirrend ist, da es nicht getLength()). – medopal

Antwort

12

Array-Typen sind speziell in Java. Dies ist ein Auszug aus JLS 10.7 Array Members

Die Mitglieder einer Array-Typ sind alle der folgenden:

  • The public final Feld length, die die Anzahl der Komponenten des Arrays enthält (Länge positiv sind oder Null).
  • Die public Methode clone, die überschreibt die gleichnamige Methode in der Klasse Object und wirft keine aktivierten Ausnahmen. Der Rückgabetyp der Clone-Methode eines Array-Typs T[] ist T[].
  • Alle Mitglieder geerbt von der Klasse Object; Die einzige Methode von Object, die nicht vererbt wird, ist ihre clone Methode.

Trotzdem gibt es noch alte stehenden Fehler, wenn Sie Reflexion auf Arrays verwenden: weder length noch clone konnte durch Reflexion zu finden (bug# 5047859, bug# 4987375).

Kein Mitglied wird auf traditionelle Weise von einer Oberklasse geerbt. Alle Array-Typen reichen von Object direkt. Diese "spezielle Behandlung" ist wahrscheinlich, warum diese Fehler überhaupt existieren.


"bedeutet dies, dass man niemals die Länge der zu definierenden Variable sehen kann?"

Es gibt keinen tatsächlichen Quellcode für Array-Typen. Auch diese Typen sind besonders; Die JVM zieht diese Typen nur dann aus dem Hut, wenn sie benötigt werden. Sie werden keine .java Quelldatei für den Array-Typ int[].class (d. H. Den Typ aller int Arrays) sehen.

Also, nein, werden Sie nicht in der Lage sein zu sehen das lengthFeld definiert.


Für weitere Lesung, sind hier einige Informationen über Java Reflection:

+0

bedeutet dies, dass man die zu definierende Längenvariable niemals sehen kann? – abson

+0

Ich habe nicht verstanden "könnte durch Reflexion gefunden werden" Ausdruck hier könnten Sie es bitte erklären? – abson

+0

@abson: Ich habe einige Anmerkungen hinzugefügt, um Ihre Kommentare zu adressieren. Fühlen Sie sich frei, nach mehr Klärung zu fragen. – polygenelubricants

2

Sie müssen etwas genauer als das sein.

Eine variable Länge kann in jeder Klasse existieren. Wenn Sie von der API meinen, dann suchen Sie wahrscheinlich nach dem Array.

Einige Klassen haben eine length() -Methode.

+0

Einige haben eine length -Eigenschaft (wie Arrays), manche eine length() -Methode, wie String, und andere eine size() -Methode, wie verschiedene Sammlungen. – extraneon

+0

Ja, es ist die Längeneigenschaft von Arrays – abson

2

In Java mit Arrays können Sie dies tun. Zum Beispiel:

String[] a = new String [] {"a","b","c"}; 
int length = a.length; 

Länge wäre 3;

+0

, aber er fragt, wo ist die Länge var? – medopal

+0

Das könnte es sein. –

+0

ja @jschoen Könnten Sie mir sagen, wo die in Ihrem Programm verwendete Längenvariable definiert ist? – abson

0

Es gibt keine einzige Antwort auf diese Frage. Jeder kann eine length Variable in einer Klasse enthalten, aber es gibt keine Garantie, dass sie existiert - oder, falls vorhanden, dass es öffentlich ist - in einer bestimmten Klasse. Sie müssen wirklich nur die Quelle für die Klasse lesen, an der Sie interessiert sind.

Ich werde sagen, dass in den weit verbreiteten JavaBean convention Klassen, die vernünftigerweise ein Längenattribut haben können, aber keine öffentliche Variable length oft haben haben getLength() und setLength() Methoden. Das ist besser als eine öffentliche Variable aus einer Reihe von Gründen, die für Ihre Frage nicht in Frage kommen, aber wenn Sie interessiert sind, schauen Sie sich this related SO question an.

+0

Ja ist es die Länge Eigenschaft von Arrays können Sie bitte sagen, wo es eigentlich definiert ist? – abson

5

Arrays sind nicht wie normale Klassen, sie sind ein Sonderfall in der Java Language Specification definiert. Daher ist die .length public final-Variable in der Java-Sprachspezifikation definiert, aber sie ist nirgendwo in einer .java-Datei oder einer .class-Datei definiert.

+0

bedeutet dies, dass es in der Objektklasse definiert ist? – abson

+0

+1 für mich gegen die JLS-Link zu schlagen. @abson, nein, es ist nicht in der Object-Klasse. Wenn Sie someArray.getclass() ausdrucken, erhalten Sie etwas, das nicht von Menschen lesbar ist, es ist ein spezieller Typ, der in die Sprache eingebaut ist. – Pops

1

Jede Klasse kann ein Feld namens length haben. Einfach hinzufügen.

Arrays haben kein length Feld; sie haben etwas, was wie einem solchen Feld aussieht:

int[] a = new int[10]; 
System.out.println("array length is: " + a.length); 

aber es ist nicht wirklich ein einfaches Feld, weil dies nicht kompilieren:

int[] a = new int[10]; 
a.length = 42; // <- here the compiler gets grumpy 

und auf der JVM-Ebene, Der Zugriff auf die Array-Länge erfolgt mit einem bestimmten Opcode (arraylength) und nicht mit dem generischen Instanz-Field-Access-Opcode (getfield).

0

Es ist eine Variable, die für ein Array zugegriffen werden kann, um herauszufinden, wie viele Elemente befinden sich im Array.