Galera uma pequena dúvida em relação a Arrays.
Quando fazemos isso:
String nomes[];
estamos declarando uma variável array nomes do tipo string, ela estaria ocupando um espaço na memória que server apenas para armazenar os endereços do array que ainda vamos criar na verdade? Através de:
nomes[] = new String[20];
Seria tipo
nomes[] está no endereço x que referência um objeto array com 20 Strings que começa no endereço y e termina no endereço y+20 ?
quando você faz:
nomes[] = new String[20];
esta definindo que o java deve guardar um objeto do tipo Array[] e que nele ficará 20 referências para objetos do tipo String que ainda não foram criados
todas as referências apontam para um lugar na memória que ainda não tem nada, apenas Null…
então quando faz String[0] = new String(“estou na posição 0 do array”); você esta dizendo que agora sim esta construindo um objeto naquele endereço que tinha sido definido.
Então quando for um objeto sempre vai apontar para uma referência, como Arrays e Strings são objetos cada espaço na memoria que os objetos String estão armazenados terá como valor algum endereço com algum valor do tipo String “Nome”. Então existirá 20 objetos String que aponta para 20 valores do tipo String? E a Array[] vai apontar o endereço do Arrays[0]. Já nos casos dos primitivos irá ser direto, o Array irá apontar para uma sequência de 20 inteiros, por exemplo.
exatamente
tenho que destacar o funcionamento do AutoBoxing, com Objetos que encapsulam tipos primitivos, quando você da (outroObjeto = objetoOriginal) ele nao pega a referência do objeto original e sim o Valor , então cria um novo objeto na memória e joga o valor do objeto original dentro do novo objeto… isso é o autoBoxing…
no caso do exemplo abaixo que não utiliza auto-boxing da pra se ver claramente como funcionam as referências:
[code]public class objeto {
String texto;
}[/code]
[code]public class Referencias {
public static void main(String[] args) {
objeto objetoOriginal = new objeto(); //criei objeto na memoria
objetoOriginal.texto = "Editei meu conteudo";
objeto[] objetos = new objeto[20];
objetos[0] = objetoOriginal;
objetoOriginal.texto = "Editei novamente meu conteudo";
System.out.println(objetos[0].texto);
//perceba que editei o objetoOriginal, mas imprimi a partir da cópia da sua referência
// ou seja tanto objetos[0] e ObjetoOriginal apontam para o mesmo objeto na memória
}
}[/code]
perceba que quando altero o valor de um, o valor do outo também altera, pois estão referenciando o mesmo objeto que só criei 1 vez.
caso tenha dúvidas do autoBoxing…entenda que se no lugar de Objeto eu utilizasse String
e fizesse String objetos[0] = objetoOriginal;
dentro do java “automaticamente” ele entederia isso como:
String objetos[0] = new String(objetoOriginal); //não pegando a referência e sim criando um novo objeto