comprimento do ponto em java – encontrando sua definição

Em que class é o campo de length definido em Java (por exemplo, para o comprimento da matriz)? Conseguirei ver o definido na class Object ?

EDIT: Por que esse campo foi projetado (qualquer coisa relacionada com segurança ou eficiência de memory)?

Os tipos de matriz são especiais em Java. Este é um excerto de JLS 10.7 Array Members

Os membros de um tipo de matriz são todos os seguintes:

  • O length campo public final , que contém o número de componentes da matriz (o comprimento pode ser positivo ou zero).
  • O clone método public , que substitui o método com o mesmo nome na class Object e não lança exceções verificadas. O tipo de retorno do método clone de um tipo de matriz T[] é T[] .
  • Todos os membros herdados da class Object; o único método de Object que não é herdado é o seu método clone .

Apesar disso, ainda há bugs antigos quando você está usando reflection em matrizes: nem o length nem o clone podem ser encontrados por meio da reflection ( bug # 5047859 , bug # 4987375 ).

Nenhum membro é herdado da maneira tradicional de qualquer superclass; Todos os tipos de matriz se estendem diretamente do Object . Esse “tratamento especial” é provavelmente o motivo pelo qual esses bugs existem em primeiro lugar.


“Isso significa que nunca será possível ver a variável de comprimento sendo definida?”

Não há código-fonte real para os tipos de matriz. Mais uma vez, esses tipos são especiais; a JVM apenas extrai esses tipos de um chapéu sempre que eles são necessários. Você não verá um arquivo de origem .java para o tipo de matriz int[].class (isto é, o tipo de toda a matriz int ).

Portanto, não, você não poderá ver o campo de length definido.


Para ler mais, aqui estão algumas informações sobre o Java Reflection:

  • Os tutoriais de Java: API de reflection
  • Artigo Técnico Tópico Tópico Avançado: Usando o Java Reflection

Matrizes não são como classs regulares, elas são um caso especial definido na Especificação da Linguagem Java . Portanto, a variável final pública .length é definida na Especificação da Linguagem Java, mas não é realmente definida em nenhum lugar em um arquivo .java ou .class.

Você precisa ser um pouco mais específico do que isso.

Um comprimento variável pode existir em qualquer class. Se você quer dizer da API, provavelmente está procurando pelo Array.

Algumas classs possuem um método length ().

Em java com matrizes você pode fazer isso. Por exemplo:

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

Comprimento seria 3;

Qualquer class pode ter um campo chamado length . Apenas adicione.

Matrizes não possuem um campo de length ; eles têm algo que se parece com tal campo:

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

mas não é realmente um campo simples, porque isso não compila:

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

e, no nível da JVM, o comprimento da matriz é acessado com um opcode específico ( arraylength ) e não com o opcode de access ao campo da instância genérica ( getfield ).

Não há uma resposta única para esta pergunta. Qualquer pessoa pode include uma variável de length em uma class, mas não há garantia de que exista – ou, se existir, que seja pública – em qualquer class. Você realmente só precisa ler a fonte da turma em que está interessado.

Eu direi que na convenção JavaBean amplamente usada, classs que poderiam razoavelmente ter um atributo de tamanho mas não ter um length variável pública freqüentemente têm getLength() setLength() e setLength() . Isso é melhor do que uma variável pública por várias razões que estão fora do escopo da sua pergunta, mas se você estiver interessado, confira esta questão SO relacionada .

É uma variável que pode ser acessada por um array para descobrir quantos elementos existem no array.