A linha de código java eo que ele faz?
Pergunta
Então, eu comprei o livro "Java for Dummies" 4th Edition, e eu devo dizer que é provavelmente os melhores 30 dólares que eu já gasto em um livro. Eu não sou novo para codificação, estou realmente bastante decente em para ele se eu assim dizer a mim mesmo.
No entanto, eu me deparei com uma linha de código que me tem um toque confuso:
public void setName(String n)
{
if(!n.equals(""))
{
name = n;
}
}
A minha pergunta surge na terceira linha, a se parte ... Eu sei como se os laços de trabalho (n.equals ( "")!) (Ie: if (esta == que) {fazer coisas}), mas eu não vi os n.equals! ( ""), criado antes. Alguém por favor pode explicar isso para mim?
PS: Apenas para jogar um palpite. É o mesmo que:
public void setName(String n)
{
if(n != "")
{
name = n
}
}
Eu acho que é apenas uma maneira de certificar-se de que, se o usuário não digite um nome (ou seja myAccount.setName = "";.) Não relaxar um erro e corre como normal, mas eu não era 't certeza.
Agradecemos antecipadamente pela ajuda!
EDIT: mudou a minha "myAccount.name = "";" a "myAccount.setName = "";.", desculpe a confusão
OBRIGADO: Vai para Asafe, apreciar a resposta! Mesmo para Lucas Aardvark, ele respondeu bem, mas Asafe respondeu à minha comentário de verificação em sua própria resposta em primeiro lugar, graças a todos!
Solução
if(!n.equals(""))
{
name = n;
}
meios se n não é uma cadeia vazia, atribuir o seu valor para nome.
Em Java, cada objeto tem um Equals (Object o) método para teste de igualdade com outro objeto. O operador == é tipicamente utilizado para comparar primitivas. Ele também pode ser usado para comparar objetos de "mesmice". ie. Os dois objetos são na verdade a mesma instância. Isto vem a calhar para tipos imutáveis, como cordas e todos os invólucros de objeto para os tipos primitivos, como Integer e Long.
Outras dicas
Em Java, strings são imutáveis, mas não internados, assim if ( "" == n) pode ou não ser verdade para outra cadeia para o qual "" .equals (n) é verdadeira.
Apenas para confundi-lo mais, isso é ruim código, ele vai ter um NullPointerException Se chamado com NULL como o argumento. Ele deve ser escrito como "" .equals (n)
As método equals () compara conteúdo das duas cordas. O == e! = Operadores dizer se os dois objetos String são o mesmo objeto ou não. Duas cordas diferentes, com o mesmo conteúdo e, portanto, é igual a () para o outro, ainda pode ser! = Uns aos outros. Apesar de cadeias de caracteres não são mutáveis, que ajuda a entender a diferença imaginando que Cordas são mutáveis, e, em seguida, é igual a () significa "Atualmente o mesmo" e meios == "será sempre a mesma".
A regra segura é sempre usar equals () a menos que você tem certeza de ambas as cordas são internados . Citando:
Segue-se que para quaisquer duas cordas s e t, s.intern () == t.intern () é verdadeira se e somente se s.equals (t) é verdade.
Todos os strings literais e cadeia de valor expressões constantes estão internados.
Considere o seguinte:
String a="";
String b="";
Tanto a e b são objetos String, cada um com sua própria alocação de memória e, portanto, um único endereço. a e b são em endereços diferentes. Quando você codificar a expressão booleana
a == b
você está comparando os endereços dos objetos, e não seu conteúdo. Para comparar a conteúdo que você deve usar é igual à do objeto String () método.
Um objeto tem uma localização física na memória, que é única para cada objeto - há dois objetos distintos podem ter o mesmo endereço de memória - e seu conteúdo ou valor. O operador == compara os endereços dos objetos; quando você código a == b você está perguntando se a e b são alias nomes para o mesmo objeto - fazer a e b referem-se ao mesmo local físico. a.Equals (b) pergunta se os dois objetos, onde quer que estejam, têm o mesmo valor.
Esta é complicado um pouco por compilador "internar", onde o compilador pode detectar em tempo de compilação que duas constantes têm o mesmo valor e reutilizar o mesmo objeto, mas isso não será verdade para valores criados durante a execução.
o método equals()
irá retornar um valor boolean
que afirma que o objeto a ser passado é 'igual a' a fazer a chamada Objeto. Este 'equivale a' método pode ser substituído em classes para fazer seu próprio teste. No caso de String
, o teste é se o valor da cadeia original é o mesmo que o valor da representação da cadeia do objecto que está sendo passado.
Como ele retorna um boolean, você pode negar o valor com um !
, então o teste é "é o argumento método não uma String vazia? Sim? em seguida, atribuí-la a nossa variável name
.
==
sempre testar se o objeto à esquerda é o mesmo que o objeto à direita, como ele se compara referências.