== de referência

oi,
estou começando em java.
vendo alguns testes fiz esse q segue abaixo.
minha pergunta: pq mesmo eu colocando os mesmos valores p os argumentos a resp é sp de diferente ?

class teste_trem {

public static void main(String[] args) {

trem t1 = new trem();
t1.nome = "Nome do Trem";
t1.modelo = "a1";
t1.carga_max = 5.0;
t1.carga_atual = 5.5;
t1.cidade_orig = "b1";
t1.cidade_dest = "c1";
t1.Status = true;

trem t2 = new trem();
t2.nome = "Nome do Trem";
t2.modelo = "a1";
t2.carga_max = 5.0;
t2.carga_atual = 5.5;
t2.cidade_orig = "b1";
t2.cidade_dest = "c1";
t2.Status = true;

System.out.println("Nome: " + t1.nome);
System.out.println("Nome: " + t2.nome);

if (t1 == t2) {
    System.out.println("Mesmo Trem"); 
}
else {
    System.out.println("Trens diferentes");
}

}}

obrigada.

para comparar objetos vc tem que usar o metodo equals não o comparador ==.
no se caso para sua comparação funcionar 100%, vc deveria sobrescrever o metodo equals, comparando os atributos de cada objeto.

[]'s

Quando se trata d objetos, o == compara referências. Ou seja, ele verifica se as suas duas variáveis apontam para o mesmo objeto e não se eles são iguais.

assim, se voce fizer
t1 = new Trem();
t2 = t1;

o == vai retornar verdadeiro.

Para comparar a igualdade de valores, voce tem que usar o metodo equals, como disseram acima.
t1.equals(t2).

Para as classes que voce cria, voce deve sobrescrever o metodo equals para que a sua comparacao seja feito do jeito que voce deseja. De uma procurada no metodo equals e no hashCode

obrigada, mas,

fiz assim:


if (t1.equals(t2)) {
System.out.println(“Mesmo Trem”);
}
else {
System.out.println(“Trens diferentes”);

mesmo assim continua dando diferentes.

Você precisa sobreescrever o método equals para que se adequar às suas necessidades.

daniel,

agora eu que tenho uma duvida:

como sobrescrever o metodo equals ? :frowning:

Ou seja, o que o Daniel falou é algo como:

class trem {
    public String nome;
    public String modelo; 
    public double carga_max;
    // etc.
    public boolean equals (Object obj) {
        if (!(obj instanceof trem)) return false;
        trem tr = (trem) obj;
        return nome.equals(tr.nome) 
            && modelo.equals(tr.modelo) 
            && carga_max == tr.carga_max; // complete com os outros campos.
    }
    // etc.
}

Dica: para sobreescrever use SEMPRE “public boolean equals (Object obj)”. Use meu código como receita de bolo, se desejar, ou então compre o livro “Effective Java”, de Joshua Bloch, onde isso e mais algumas outras coisas estão explicadas.

http://www.linux.ime.usp.br/~bani/java/ej2.html

Como foi falado ontem na aula do D. Destro, vc só deve usar == para comparar referencias ou variáveis primitivas. Isso é questão pegadinha de certificação.

Dois objetos podem ser logicamente iguais mais serem diferentes e residirem em endereços de memória (referencias) diferentes.

Mais sobre isso na próxima aula do D. Destro. :wink:

valeu pessoal !!!

:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

gostei bastante

Aliás, só aproveitando o gancho do thingol, sempre que você sobreescrever o método equals, faça o mesmo para o método hashCode.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)