一行の Java コードとそれが何をするのか?
質問
そこで私は「Java for Dummies」第 4 版という本を購入しました。これはおそらく私がこれまで本に費やした最高の 30 ドルだと言わざるを得ません。私はコーディングに慣れているわけではありません。自分で言うのもなんですが、実際にはかなり上手です。
ただし、少し混乱するコード行に遭遇しました。
public void setName(String n)
{
if(!n.equals(""))
{
name = n;
}
}
私の質問は 3 行目の if(!n.equals("")) の部分にあります...if ループがどのように機能するかは知っています (つまり:if(this == that){do things}) ですが、!n.equals("") が設定されているのを見たことがありません。誰か説明してくれませんか?
追伸:推測を加えるだけです。それは次と同じですか:
public void setName(String n)
{
if(n != "")
{
name = n
}
}
これは、ユーザーが名前を入力しない場合にそれを確認するための単なる方法だと思います(つまり、myAccount.setName = "";)エラーはキックバックされず、通常どおり実行されますが、確信がありませんでした。
よろしくお願いします!
編集:私の「myaccount.name = ""; "を変更しました「myaccount.setname = ""; "に、混乱について申し訳ありません。
ありがとう:アサフに行きます、答えてくれてありがとう!Lucas Aardvark と同じように、彼も答えましたが、Asaph は最初に自分の答えで私の検証コメントに答えました、皆さんありがとう!
解決
if(!n.equals(""))
{
name = n;
}
Nが空の文字列でない場合、名前にその値を割り当てることを意味する。
は、Javaでは、すべてのオブジェクトが別のオブジェクトと等しいかどうかをテストするために等しい(オブジェクトo)メソッドを有します。 ==演算子は、一般的にプリミティブを比較するために使用されます。また、「同一性」のためのオブジェクトを比較するために使用することができます。すなわち。 2つのオブジェクトが実際には同じインスタンスです。これは、文字列や、整数やロングなどのプリミティブ型のすべてのオブジェクトラッパーとして不変のタイプに重宝します。
他のヒント
Javaでは、文字列はそう、不変ですが、インターンではありません 場合は、(「」== N)、または、別の文字列のために当てはまらない場合があります これは "" .equals(N)についても同様である。
ただ、これは悪いコードで、より多くのあなたを混乱させるために、それはNullPointerExceptionが取得されます 引数にnullを使用して呼び出された場合。それは "" .equals(N)
のように記述されるべきですequals() メソッドは、2 つの文字列の内容を比較します。== 演算子と != 演算子は、2 つの String オブジェクトが同じオブジェクトであるかどうかを示します。同じ内容を持つ 2 つの異なる文字列、つまり相互にquals() であっても、相互に != である可能性があります。文字列は変更可能ではありませんが、文字列が変更可能であり、equals() は「現在同じである」を意味し、== は「常に同じである」を意味すると想像すると、違いを理解するのに役立ちます。
安全なルールは、両方の文字列が確実に一致する場合を除き、常にequals()を使用することです。 インターン. 。引用:
任意の2つの文字列sとtで、S.Intern()== t.intern()は、S.Equals(t)が真である場合にのみTRUEです。
すべての文字通りの文字列と文字列値の定数式がインターンされています。
これを考えてみます:
String a="";
String b="";
AとBの両方が独自のメモリ割り当て、したがって固有のアドレスを持つそれぞれ、文字列オブジェクトです。 AとBは異なるアドレスです。あなたはブール式をコーディングするとき、
a == b
あなたはその内容、オブジェクトのアドレスを比較しているではありません。比較するには 内容あなたは()メソッドStringオブジェクトの等号を使用する必要があります。
その内容または値 - どの2つの別個のオブジェクトが同一のメモリアドレスを持つことはできません -オブジェクトは、各オブジェクトに固有のメモリ内の物理的な位置を有しています。 ==演算子は、オブジェクトのアドレスを比較し、 aとbが同じオブジェクトのエイリアス名であれば、あなたが求めているbはあなたが==をコーディングするとき - やるとbが同じ物理的な場所を参照してください。彼らができる限り2つのオブジェクトが、同じ値を有する場合a.equals(b)に要求します。
このコンパイラは2つの定数が同じ値を持っていることをコンパイル時に検出し、同じオブジェクトを再利用するが、これは、実行時に作成された値に対して真ではありませんかもしれところ、「インターン」コンパイラによって多少複雑になっている。
方法equals()
は、渡されるオブジェクトは、オブジェクトが呼び出しを行う「と等しい」であると述べboolean
値を返します。このメソッドは、独自のテストをするために、クラスでオーバーライドすることができます「に等しいです」。 String
の場合には、テストは、元の文字列の値が渡されているオブジェクトの文字列表現の値と同じであるかどうかである。
は、あなたはテストがあるので、「メソッドの引数が空の文字列ではないのですか?」、!
と価値を否定することができますはい?その後、私たちのname
変数に割り当てます。
==
は常にそれが参照を比較して、左側のオブジェクトのは、の右側のオブジェクトと同じであるかどうかをテストします。