Estou com uma pequena duvida em relação ao uso dos construtores, talves uma duvida boa. Como saber quando devo usar um construtor?
Estou com outra duvidas em relação aos operadores “||” e “|”. Em que casos devo usar eles e como eles agem?
Fiz o seguinte if:
if((ladoA || ladoB || ladoC) == 0)
e quando tento compilar da erro, diz que o operador “||” não pode ser aplicado para int (operator || cannot be applied to int,int)
mas quando utilizo o if da seguinte forma:
if((ladoA | ladoB | ladoC) == 0)
Não ocorre nenhum problema. Por que está ocorrendo isso e qual a diferença de um para o outro?
o operador || é um pouco + “inteligente” que o operador “|”
o primeiro só segue a adiante no código se for necessario, o segundo executa o código todo sempre…
por exemplo
public boolean teste(MeuObjeto m) {
MeuObjeto m2 = new MeuObjeto(0);
if (m == null || m.equals(m2))
return false;
else
...
}
esete código primeiro testa se é nulo, se for nulo, ele nem verifica se m.equals(m2) pois a primeira condição do “||” OU já foi atendida…
public boolean teste(MeuObjeto m) {
MeuObjeto m2 = new MeuObjeto(0);
if (m == null | m.equals(m2))
return false;
else
...
}
esse segundo código, testa os 2 lados do OU sempre… portanto se o objeto enviado for NULO, vai dar true para a primeira parte, porem ele vai tentar fazer m.equals(m2) o que vai gerar 1 erro no seu código, visto que sendo “m” null, não se pode fazer m.equals(…) pois isso gera um NullPointerException…
…
todo operador duplicado || && … etc … tem essa peculiaridade… ele so prossegue os testes se for realmente necessario…
…
EDIT.: não vi direito, vc quer fazer outro tipo de teste, pelo que entendi, vc quer saber c ladoA ou ladoB ou ladoC == 0 … se o que vc espera é isso, esse seu teste não faz isso… (ladoA | ladoB | ladoC) produz um número, que eu na verdade não sei bem com funciona…
[quote=Lavieri]
EDIT.: não vi direito, vc quer fazer outro tipo de teste, pelo que entendi, vc quer saber c ladoA ou ladoB ou ladoC == 0 … se o que vc espera é isso, esse seu teste não faz isso… (ladoA | ladoB | ladoC) produz um número, que eu na verdade não sei bem com funciona…[/quote]
Eu entendi sua explicação agora está mais claro, mas ainda não entendo por que surge um erro no meu código quando uso o operador “||” e não surge quando eu uso o operador “|”.
O operador | faz operações de bit.
Ou seja, com dois inteiros, ele comparará bit pot bit desses inteiros, e retornará um novo número inteiro, com a combinação desses bits.
Por exemplo:
int x = 104;
int y = 57;
x = 1101000 //104 em binário
y = 1001011 //57 em binário
x | y = 1101011
Já o operador || serve única e exclusivamente para boolean. Ele faz a comparação lógica entre dois valores booleanos, e retorna um bool. Portanto, é impossível testar se o resultado é igual a zero, ou comparar 2 inteiros usando ||.
Lembre-se que no java tipos numéricos não são implicitamente convertíveis para valores booleanos, nem-vice versa.
Seu teste nada mais quer do que ver se as três variáveis tem valor zero. Como você compara com OU, um único bit em qualquer uma das variáveis que seja diferente de zero gerará um resultado maior que zero.