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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top