[quote=camilolopes]
/* qdo quiser comparara referencia de um tipo ==
qdo quiser comparar se dois objeto sao iguais equals()*/
[/quote]
Não entendi direito o que você quis dizer, mas, de qualquer forma, lá vai:
Quando estamos comparando dois objetos, utilizamos:
:arrow: == para verificar se os objetos comparados são, na verdade, o mesmo objeto.
:arrow: equals para verificar se um objeto é equivalente ao outro objeto. Note que o critério que define se um objeto (o que invoca o equals) é equivalente ao outro objeto (o que é passado por parâmetro) depende exclusivamente da implementação do método equals dada pela classe do objeto que invoca o equals.
[quote=camilolopes]/*o que pude entender aqui que enum nao sao objetos eh um tipo de
variavel que posso comparar com referencia semelhante a comparar se
Moto m = new Moto(); Moto mt = new Moto();
entao no exemplo acima to comparando se as varaiaveis enum referencia a outra
e nao se sao objetos? seria isso.*/
[/quote]
Desculpe, mas não consegui entender o que vc escreveu aqui… vou tentar advinhar, ok?
Como já disse antes, enums são objetos sim! O que define se uma variável é ou não um objeto (O apropriado a se dizer seria: “faz referência ou não a um objeto”), não é o fato de se compará-lo usando == ou equals. Isso não tem nada a ver. O que define se uma variável é um ou não um objeto, é se ela é de algum tipo de dado que seja subclasse de Object.
Do jeito que você fez seu exemplo, dá a entender que Moto é alguma classe aí que você inventou. Sendo assim, supondo que temos a situação por você mencionada:
Moto m = new Moto();
Moto mt = new Moto();
Podemos comparar se m é a mesma instância que mt utilizando o operador “==”:
boolean ehMesmaInstancia = m == mt;
Ou então, podemos comparar se m é equivalente a mt utilizando o método equals:
boolean saoEquivalentes = m.equals(mt);
Ja podemos saber de antemão que a variável ehMesmaInstancia vai ser false, pois m e mt foram criados, cada um, com um new diferente. Agora, se a variavel saoEquivalentes vai ser true ou false, vai depender de como você sobrescreveu o método equals na classe Moto.
[quote=camilolopes]/* entao a pag 166 da kathy em port ta errada ela diz que se usar
= = com referencia diferente imprime verdadeiro, ja que no exemplo dela
eu tenho duas variaveis do tipo enum porem com referencia diferente e o codigo
dizendo ela retorna verdade no seria falso?*/
[/quote]
camilolopes, por favor, tente utilizar virgulas quando você escrever, pois fica muito difícil de entender o que você quer dizer quando escreve assim… :roll:
Essa parte da sua questão se explica com o que já foi discutido aqui antes:
Vamos supor o seguinte enum:
enum Color{RED, BLUE};
O elemento RED do enum Color - o qual não deixa de ser uma classe - é de um objeto de uma classe anônima, filha da classe Color. Este elemento RED é também publico, estático e constante. Isso quer dizer o seguinte:
:arrow: Você sempre pode obter o objeto RED diretamente a partir da classe Color (Você não precisa de uma instância de Color, para obter o elemento RED)
:arrow: O elemento RED vai sempre referenciar um único e mesmo objeto (Por ser final, RED nunca mais poderá apontar para outro objeto), o qual é de uma classe anônima, filha de Color.
Sendo assim, se tivermos o seguinte trecho:
Color cor01 = Color.RED;
Color cor02 = Color.RED;
Podemos raciocinar da seguinte maneira: Se Color.RED sempre, sempre, vai referenciar um mesmo objeto, então cor01 e cor02 estão, na verdade, apontando para o mesmo objeto que Color.RED. Isso quer dizer que cor01 e cor02 apontam para um mesmo objeto (usualmente, diriamos que cor01 e cor02 são uma mesma instância, um mesmo objeto). Sendo assim, cor01 == cor02, de fato, retorna true.