Pessoal,
Ví a seguinte frase em um livro, e fiquei um pouco confuso, alguém poderia me dar um exemplo.
Por favor !
Obrigado.
Use == para determinar se duas variáveis de referência apontam para o mesmo objeto.
Pessoal,
Ví a seguinte frase em um livro, e fiquei um pouco confuso, alguém poderia me dar um exemplo.
Por favor !
Obrigado.
Use == para determinar se duas variáveis de referência apontam para o mesmo objeto.
Todas as variáveis no Java são “de referência” (exceto se elas forem de tipos primitivos, como “int”, “float”, “short”, “double”, “boolean”).
Elas ou apontam para algum objeto, ou então estão vazias (valor “null”).
O operador “==” permite você testar se as variáveis apontam para o mesmo objeto, ou não.
Exemplo:
class Cliente {
String nome;
public Cliente (String pNome) { nome = pNome; }
}
...
Cliente cl1 = new Cliente ("Jose"); // cl1 aponta para um objeto Cliente
Cliente cl2 = new Cliente ("Jose");
Cliente cl3 = new Cliente ("Aparecido");
Cliente cl4 = cl2;
System.out.println (cl1 == cl3); // imprime "false"
System.out.println (cl2 == cl4); // imprime "true" porque aponta para o mesmo objeto
System.out.println (cl1 == cl2); // imprime "false" porque são objetos diferentes, embora criados da mesma maneira.
Veleu.
Obrigado.
Exatamente, quando você cria dois objetos, como por exemplo:
Usuario user1 = new Usuario();
Usuario user2 = new Usuario();
Você criou dois objetos e quando você executa o comando:
user1 == user2
Você está comparando a referência dos objetos, ou seja, a posição que eles ocupam na memório.
Acho que deu para entender hehehe
Boa tarde pessoal,
Como esse assunto é sempre curioso pelas exceções a regra vou colocar uma serie de testes simples de serem executados para o pessoal notar a diferença entre as variaveis de referencia e primitivas.
[code]/*
import java.util.ArrayList;
import org.junit.*;
/**
*
@author frederico
*/
public class TesteReferencia {
class Cliente {
String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Cliente(String pNome) {
nome = pNome;
}
}
@Test
public void testeStringBuffer() {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
StringBuffer c = new StringBuffer("C");
StringBuffer d = c;
c.append("D");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
Assert.assertEquals(d, c); //Teste Ok!!!
}
@Test
public void testeString(){
String a = new String(“A”);
String b = new String(“B”);
String c = new String(“C”);
String d = c;
c = “D”;
System.out.println(a);
System.out.println(b);
System.out.println©;
System.out.println(d);
Assert.assertEquals(d, c); //Teste falhou!!!
}
@Test
public void testeReferencia() {
Cliente cl1 = new Cliente(“Jose”); // cl1 aponta para um objeto Cliente
Cliente cl2 = new Cliente(“Jose”);
Cliente cl3 = new Cliente(“Aparecido”);
Cliente cl4 = cl2;
ArrayList list = new ArrayList();
list.add(cl1);
list.add(cl2);
list.add(cl3);
list.add(cl4);
list.get(3).setNome("Y");
Cliente cl5 = list.get(3);
cl5.setNome("H");
cl2.setNome("Fred");
System.out.println(cl1 == cl3); // imprime "false"
System.out.println(cl2 == cl4); // imprime "true" porque aponta para o mesmo objeto
System.out.println(cl1 == cl2); // imprime "false" porque são objetos diferentes, embora criados da mesma maneira.
System.out.println(cl2.getNome()); // imprime Fred
System.out.println(cl4.getNome()); // imprime Fred
System.out.println(cl5.getNome()); // imprime Fred
System.out.println(list.get(3).getNome()); // imprime Fred
Assert.assertEquals(cl4, cl2); //Teste Ok!!!
Assert.assertEquals(cl4, cl5); //Teste Ok!!!
Assert.assertEquals(cl5, cl2); //Teste Ok!!!
}
@Test
public void testePrimitivas() {
int a = 1;
int b = 2;
int c = a;
a = 3;
System.out.println(a);
System.out.println(b);
System.out.println(c);
Assert.assertEquals(a, c); //Teste falhou!!!
}
}
[/code]
Note que mesmo String sendo um objeto ele foge a regra, então cuidado com essa pegadinha nas provas pelo mundo a fora.
um abraço.
Besteira; String é uma classe como todas as outras, e não foge a regra nenhuma.
O que ocorre é que “assertEquals” usa “equals”, não “==”, então você “acha” que se comporta como um tipo primitivo (já que 2 strings com mesmo conteúdo dão OK para equals).
Olá,
A classe String possui somente algumas peculiaridades.
- String em Java são imutáveis. Se você altera ou faz concatenação de Strings, você pode estar construíndo um novo Objeto String.
- Existem duas formas de construir Strings em relação ao local da memória no qual a String vai ser armazenada:
Strings podem ser armazenadas na memória HEAP ou na Pilha. Veja:
String nome1 = "Ana"; //Armazena na Pilha, e é gerenciada pelo Pool de Strings
String nome2 = "Ana"; //Armazena na Pilha, e é gerenciada pelo Pool de Strings
String nome3 = new String("Ana"); //Um objeto como outro qualquer, memória Heap
String nome4 = new String("Ana"); //Um objeto como outro qualquer, memória Heap
Se uma String é armazenada no Poll, como nome1 e nome2, ambas variáveis guardam a mesma referência, pois o poll gerencia as Strings
Se uma String é armazenada na Heap, como nome3 e nome4, temos dois objetos distintos. Dois comandos new, dois objetos.
Espero ter contribuído.
Glauco Todesco
Não faça isso, pois estará criando dois objetos. Use apenas “xxx” e pronto.
se vc olhar a api para esse construtor:
Ou seja, você cria um objeto quando declara “” e mais uma cópia quando chama o construtor.