Criando uma matriz com variáveis de referência
Você pode escolher qualquer tipo de Java para ser o tipo da matriz. Isso inclui classes que você mesmo cria. Vamos dar uma olhada em um tipo embutido com String:
public class ArrayType {
public static void main(String args[]) {
String [] bugs = { "cricket", "beetle", "ladybug" };
String [] alias = bugs;
System.out.println(bugs.equals(alias)); // true
System.out.println(bugs.toString()); // [Ljava.lang.String;@160bc7c0
}
}
Podemos chamar equals() porque um array é um objeto. Ele retorna verdadeiro por causa da referência igualdade. O método equals() em matrizes não examina os elementos da matriz.
Lembre-se, isso funcionaria mesmo em um int [] também. int é um primitivo; int [] é um objeto.
A segunda declaração de impressão é ainda mais interessante. O que na terra é [Ljava.lang.String;@160bc7c0? Você não precisa saber disso para o exame, mas [L significa que é um array,java.lang.String é o tipo de referência e 160bc7c0 é o código hash.
Desde o Java 5, o Java forneceu um método que imprime uma matriz bem: java.util.Arrays.toString (bugs) iria imprimir [cricket, beetle, ladybug]. O exame tende a não usá-lo porque a maioria das perguntas sobre matrizes foram escritas há muito tempo. Independentemente disso, este é um método útil ao testar seu próprio código.
Certifique-se de entender a Figura 3.5. A matriz não aloca espaço para a cadeia de objetos. Em vez disso, ele aloca espaço para uma referência para onde os objetos são realmente armazenados.
Como uma rápida revisão, o que você acha que esta matriz aponta?
class Names {
String names[];
}
Você nos pegou. Foi uma revisão do Capítulo 1 e não nossa discussão sobre matrizes. A resposta é null. O código nunca instanciou o array, portanto é apenas uma variável de referência para null. Vamos tentar isso de novo - para que você acha que essa matriz aponta?
class Names {
String names[] = new String[2];
}
É uma matriz porque tem colchetes. É uma matriz do tipo String, já que é o tipo mencionado na declaração. Tem dois elementos porque o comprimento é 2. Cada um desses dois
slots atualmente é nulo, mas tem o potencial de apontar para um objeto String.
Lembre-se do casting do capítulo anterior quando você queria forçar um tipo maior em um tipo menor? Você pode fazer isso com matrizes também:
3: String[] strings = { "stringValue" };
4: Object[] objects = strings;
5: String[] againStrings = (String[]) objects;
6: againStrings[0] = new StringBuilder(); // DOES NOT COMPILE
7: objects[0] = new StringBuilder(); // careful!
A linha 3 cria uma matriz do tipo String. A linha 4 não requer um lançamento porque o objeto é um tipo mais amplo que String. Na linha 5, um elenco é necessário porque estamos nos movendo para um tipo específico. A linha 6 não compila porque um String[] só permite objetos String e StringBuilder não é uma String.
A linha 7 é onde isso fica interessante. Do ponto de vista do compilador, isso é apenas bom. Um objeto StringBuilder pode ir claramente em um Object []. O problema é que nós não temos realmente um objeto[] . Nós temos uma String [] referenciada a partir de uma variável Object [] . No tempo de execução, o código lança um ArrayStoreException . Você não precisa memorizar o nome desta exceção, mas você precisa saber que o código lançará uma exceção.