2010-03-22 18 views
6

¿En qué clase se encuentra el campo length definido en Java (por ejemplo, para la longitud de la matriz)? ¿Podré verlo definido, por ejemplo, en la clase Object?dot length in java - finding its definition

EDITAR: ¿Por qué se diseñó este campo (algo relacionado con la seguridad o la eficacia de la memoria)?

+0

¿Estamos hablando de longitud de cadena, longitud de matriz, tamaño de objeto, o qué? –

+0

@Jason: Creo que está hablando de los arreglos. – missingfaktor

+0

@Jason, creo que está hablando de array.length, String no tiene una variable de longitud, tiene el método de longitud() (que es confuso ya que no es getLength()). – medopal

Respuesta

12

Los tipos de matriz son especiales en Java. Este es un extracto de JLS 10.7 Array Members

Los miembros de un tipo de matriz son todos de los siguientes:

  • El public final campo length, que contiene el número de componentes de la matriz (longitud puede ser positivo o cero).
  • El public método clone, que anula el método del mismo nombre en la clase Object y no arroja excepciones marcadas. El tipo de devolución del método de clonación de un tipo de matriz T[] es T[].
  • Todos los miembros heredados de la clase Objeto; el único método de Object que no se hereda es su método clone.

A pesar de esto, todavía hay errores vieja data cuando se está utilizando la reflexión sobre matrices: ni length ni clone se puede conocer a través de la reflexión (bug# 5047859, bug# 4987375).

Ninguno de los miembros se hereda de la forma tradicional de cualquier superclase; todos los tipos de matriz se extienden desde Object directamente. Este "tratamiento especial" es probable por qué existen estos errores en primer lugar.


"¿significa esto que nunca se podrá ver la variable de longitud que se define?"

No hay un código fuente real para los tipos de matriz. De nuevo, estos tipos son especiales; la JVM simplemente saca estos tipos de un sombrero cada vez que se requieren. No verá un archivo de origen .java para la matriz tipo int[].class (es decir, el tipo de todas las matrices int).

tanto, no, usted no será capaz de ver la length campo definido.


Para leer más, aquí información sobre Java Reflection:

+0

¿significa esto que nunca se podrá ver la variable de longitud definida? – abson

+0

no entendí 'podría encontrarse a través de la frase de reflexión' aquí podría explicarlo? – abson

+0

@abson: agregué algunos comentarios para dirigir sus comentarios. Siéntase libre de pedir más aclaraciones. – polygenelubricants

2

Tienes que ser un poco más específico que eso.

Puede existir una longitud variable en cualquier clase. Si te refieres a la API, probablemente estés buscando la matriz.

Algunas clases tienen un método de longitud().

+0

Algunos tienen una propiedad de longitud (como Arrays), otros un método de longitud(), como String, y otros un método de size(), como varias colecciones. – extraneon

+0

Sí, es la propiedad de longitud de las matrices – abson

2

En java con matrices puede hacerlo. Por ejemplo:

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

La longitud sería 3;

+0

, pero él se pregunta ¿dónde está la longitud var? – medopal

+0

Eso podría ser. –

+0

sí @jschoen ¿podría decirme dónde se define la variable de longitud utilizada en su programa? – abson

0

No hay una respuesta única a esta pregunta. Cualquiera puede incluir una variable length en una clase, pero no hay garantía de que exista, o si existe, de que sea pública en una clase dada. Realmente solo tiene que leer la fuente de la clase que le interesa.

Diré que en el ampliamente usado JavaBean convention, las clases que razonablemente pueden tener un atributo de longitud pero no tienen una variable pública length a menudo tiene getLength() y setLength() métodos. Es mejor que una variable pública por varias razones que están fuera del alcance de su pregunta, pero si está interesado, consulte this related SO question.

+0

Sí, es la propiedad de longitud de las matrices ¿podría indicar dónde está realmente definida? – abson

5

Las matrices no son como las clases normales, son un caso especial definido en el Java Language Specification. Por lo tanto, la variable final pública .length se define en la Especificación del lenguaje Java, pero en realidad no está definida en ningún lugar en un archivo .java o .class.

+0

¿significa esto que está definido en la clase de objeto? – abson

+0

+1 por darme un golpe al enlace JLS. @abson, no, no está en la clase Object. Si imprime algunos Array.getclass(), obtiene algo no legible por humanos, es un tipo especial integrado en el lenguaje. – Pops

1

Cualquier clase puede tener un campo llamado length. Solo agrégalo.

Las matrices no tienen un campo length; que tienen algo, que parece tal campo:

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

pero no es realmente un campo llano, porque esto no se compila:

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

y, en el nivel JVM, la longitud de la matriz se accede con un código de operación específico (arraylength) y no con el código de acceso de campo de instancia genérica (getfield).

0

Es una variable que se puede acceder a una gran variedad de averiguar cómo muchos elementos que hay en la matriz.