Domanda

Così ho acquistato il "Java for Dummies" libro 4a Edizione, e devo dire che è probabilmente i migliori 30 dollari che abbia mai trascorso su un libro. Io non sono una novità per la codifica, sono in realtà abbastanza decente a esso se lo dico io.

Tuttavia, ho incontrato una riga di codice che mi ha un tocco confuso:

public void setName(String n)
{
     if(!n.equals(""))
     {
          name = n;
     }
}

La mia domanda arriva nella terza riga, la parte se ... So come se i cicli di lavoro (ad esempio: se (questo == che) {} fare cose) (n.equals ( "")!), ma io non ho visto l'! n.equals ( "") istituito prima. Qualcuno può spiegare a me?

PS: Solo per gettare in una congettura. E 'lo stesso come:

public void setName(String n)
{
     if(n != "")
     {
          name = n
     }
}

Credo che sia solo un modo per fare in modo che, se l'utente non digita un nome (es myAccount.setName = "";.) Non sdraiarsi un errore e corre come normale, ma non ero 't sicuro.

Grazie in anticipo per l'aiuto!

EDIT: cambiato il mio "myAccount.name = "";" a "myAccount.setName = "";"., dispiace per la confusione

GRAZIE: Va a Asaf, apprezzare la risposta! Anche a Lucas Aardvark, ha risposto così, ma Asaf risposto il mio commento verifica nella sua risposta prima, grazie a tutti!

È stato utile?

Soluzione

if(!n.equals(""))
{
     name = n;
}

significa che se n non è una stringa vuota, assegnare il valore di nome.

In Java, ogni oggetto ha un Equals (Object o) metodo per verificare l'uguaglianza con un altro oggetto. L'operatore == viene tipicamente usato per confrontare primitive. Può anche essere utilizzato per confrontare gli oggetti per "identità". vale a dire. I due oggetti sono infatti stessa istanza. Questo è utile per i tipi immutabili come le stringhe e tutti i wrapper di oggetto per i tipi primitivi come Integer e Long.

Altri suggerimenti

In Java, le stringhe sono immutabili, ma non internato, così  if ( "" == n) potrebbe o non potrebbe essere vero per un'altra stringa per il quale "" .equals (n) è vera.

Giusto per confondere di più, questo è male il codice, si otterrà un NullPointerException se chiamato con null come argomento. Dovrebbe essere scritto come "" .equals (n)

Il metodo Equals () confronta il contenuto delle due stringhe. Il == e! = Operatori dirvi se i due oggetti String sono lo stesso oggetto oppure no. Due diverse stringhe con lo stesso contenuto, e quindi equals () tra di loro, possono ancora essere! = Gli uni agli altri. Anche se le stringhe non sono mutabili, aiuta a capire la differenza immaginando che le stringhe sono mutabili, e quindi è uguale a () significa "sono attualmente lo stesso" e == significa "sarà sempre la stessa".

La regola di sicurezza è di usare sempre equals () se non sei sicuro entrambe le stringhe sono internato . Citando:

  

Ne consegue che per ogni due stringhe s   e t, s.intern () == t.intern () è   vero se e solo se s.equals (t) è   vero.

     

Tutte le stringhe letterali e tipo stringa,   espressioni costanti sono internati.

Considerate questo:

String a="";
String b="";

Sia a che b sono oggetti String, ciascuno con la propria allocazione di memoria e quindi un indirizzo univoco. a e b sono a indirizzi diversi. Quando si codifica l'espressione booleana

a == b

si sta confrontando gli indirizzi degli oggetti, non il loro contenuto. Per confrontare il contenuto devi usare eguali dell'oggetto String () metodo.

Un oggetto ha una posizione fisica in memoria, che è unico per ogni oggetto - non esistono due oggetti distinti possono avere lo stesso indirizzo di memoria - e il suo contenuto o valore. L'operatore == confronta gli indirizzi degli oggetti; quando si codifica a == b ti stai chiedendo se a e b sono i nomi alias per lo stesso oggetto - fare A e B si riferiscono alla stessa posizione fisica. a.equals (b) chiede se i due oggetti, ovunque si trovino, hanno lo stesso valore.

Questo è complicato alquanto dal compilatore "internamento", dove il compilatore può rilevare in fase di compilazione che due costanti hanno lo stesso valore e riutilizzare lo stesso oggetto, ma questo non sarà vero per i valori creati in fase di esecuzione.

il metodo equals() restituirà un valore boolean cui si afferma che l'oggetto passato è 'uguale' l'oggetto che effettua la chiamata. Cio 'equivale a' metodo può essere sottoposto a override in classi per rendere la propria prova. Nel caso di String, il test è se il valore della stringa originale è uguale al valore della rappresentazione stringa dell'oggetto essendo passata.

Come si ritorna un valore booleano, si può negare il valore con un !, quindi il test è 'è l'argomento metodo non una stringa vuota?' Sì? poi assegnarlo alla nostra variabile name.

== sarà sempre verificare se l'oggetto sulla sinistra è lo stesso che l'oggetto sulla destra, come si confronta riferimenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top