ちなみに、今のお仕事は、Android アプリで、 @ 仕様書から試験項目策定 A 試験実行結果の確認 B 障害時の原因調査(ソースコードは読める範囲で) C 障害報告 D テストデータ作成(大量なので、Excel VBA とか、JavaScript とかで、 csv や、json に出力) E 自動テストソフトのコーディング
public class StringObj { public static void main(String[] args) { String[] a = {"DEF", "ABC"}; String b = "ABC"; String c = "A" + "B" + "C"; String d = new String(); d = "ABC"; System.out.println(a[1] == b); System.out.println(a[1] == c); System.out.println(c == d); } }
public class StringObj { public static void main(String[] args) { String[] a = {"DEF", "ABC"}; String b = "ABC"; String c = "A" + "B" + "C"; String d = new String(); d = "ABC"; System.out.println(a[1] == b); System.out.println(a[1] == c); System.out.println(c == d); } }
String d = new String(); 例えば、このように書いた場合、Strongクラスで、dオブジェクトを使うことを意味する クラスでオブジェクトを使うというのが、オブジェクト指向の考え方で、 Strongクラスには、このクラスのメソッドが入っていて、 それをdオブジェクトとして使用するということ
String eee = new String(); こんな風に書いた場合、同じStringクラスのメソッドをeeeオブジェクトで使うということです
>>624 ==はオブジェクトが同じであればtrueを返す。 String c = "ABC"; String d = new String(); のとき、c == dはfalse。 なのでcオブジェクトとdオブジェクトは異なるオブジェクト。
d = "ABC"; によってdオブジェクトに"ABC"が代入されると仮定する。 dオブジェクトはcオブジェクトと異なることに変わりはない。 c == dはfalseになるはず。 c == dはtrue。なので仮定は誤りであるみたいな。
628 :仕様書無しさん:2013/08/08(木) NY:AN:NY.AN
誤字訂正)
String d = new String(); 例えば、このように書いた場合、Stringクラスを、dオブジェクトを使うことを意味する クラスをオブジェクトを使うというのが、オブジェクト指向言語の考え方で、 Stringクラスに、このクラスのフィールドが入っていて、 それをdオブジェクトとして使用するということです。
public class AA { // フィールドの宣言 public int aaaa; public int bbbb;
// コンストラクタ public AA(int a, int b){ this.aaaa = a; this.bbbb = b; } }
で、 String d = new String(); と定義しますこれはString型のオブジェクト変数dの参照先がnewされたString型のオブジェクトへの参照となります 次の行で d = "ABC"; とすると、String型の変数dの参照先はコンスタントプール内の"ABC"を指すようになります
>>637 クラスはオブジェクトの設計図なのでクラスに代入するという表現は間違いだと思う。 String c = "ABC"; String d = new String(); d = "ABC"; オブジェクトが変わらないのであれば、こう書いたときc == dはfalseになるはずだよ。 でもそうならない。だからあなたが言ってることはでたらめ。
public class StringObj { public static void main(String[] args) { String[] a = {"DEF", "ABC"}; String b = "ABC"; String c = "A" + "B" + "C"; String d = new String(); d = "ABC"; System.out.println(a[1] == b); System.out.println(a[1] == c); System.out.println(c == d); } }
String d = new String(); というのはStringクラスのオブジェクトを作成してメモリ上に置いて変数dはその位置を指し示している d = "ABC"; によって変数dはメモリ上に置いてある(上記されてるコンスタントプールの事ね)を指し示す事になり さっき作成されたStringクラスのオブジェクトはどこからも参照されなくなってゴミ箱入り(GCの対象となる)
> 「String d = new String();」このインスタンス作成をC言語に直すと「String d;」こういうことだね?
違う 敢えて置き換えるなら String x; String * d = &x; って感じ?
707 :仕様書無しさん:2013/08/09(金) NY:AN:NY.AN
String d = new String(); d = "ABC"; だったら、これをどう読み解く?
String d; d = "ABC"; もし、このように書いてあれば、それほど悩むことはない String型でd変数を宣言して、d変数に"ABC"を代入しているだけだ
String d = new String(); だが、こう書くと、インスタンス作成をしているが 初期化という意味にもなる
d = "ABC"; だったら、これも説明が付く
・・・・OK。何となくわかった! String d = new String(); これは、誰が何と言おうとインスタンス作成である そしてインスタンス作成をするとコンストラクタを読みに行く、そしてコンストラクタとは初期化を意味する つまり、dはStringクラスで初期化されたということで、 これは、型名の初期化を意味するわけだな
型名の初期化なんて聞いたことなかったよ 変数の初期化なら解かるが
708 :仕様書無しさん:2013/08/09(金) NY:AN:NY.AN
>String d = new String(); >d = "ABC"; >だったら、これをどう読み解く?
1行目のnewが無駄にインスタンス作成しているだけ String d; d = "ABC"; でも同じ
>>732 もう一問いっときます public class StrTest { public static void main(String[] args) { String a = new String("ABC"); String b = new String("ABC"); String c = "ABC"; String d = "ABC"; System.out.println(a == b); System.out.println(c == d); System.out.println(a == c); } }
これはの結果はどう表示されますか?
735 :仕様書無しさん:2013/08/09(金) NY:AN:NY.AN
ああ、なるほど。 普通の値ではなく、文字列を扱ってるところに何か引っかかりますね。
String b = "ABC"; こんな風に書いても、このABCという文字列が そのままメモリに収められるわけではない CPUのレジスタを経由してメモリに移送される時に、 もっと分解されてメモリに運ばれてポインタを返しているはず
HDD ⇒ CPU ⇒ メモリ データと言うのはこういう流れで、HDDからメモリに値が運ばれることになる
メモリ ⇒ CPU ⇒ メモリ ⇒ 解放(データ消滅) その後は、メモリ内でポインタを使ってデータを引っこ抜いたりして 計算を行っている