0
String型の変数をインスタンス化しなくてよいわけ?
Javaを勉強中に疑問に思いました。
素人ですので、やさしくお願いします。
<質問>
String s = "Java"はインスタンス化しなくてもよいですよね・・・
それな、なぜなんでしょうか?
0
Javaを勉強中に疑問に思いました。
素人ですので、やさしくお願いします。
<質問>
String s = "Java"はインスタンス化しなくてもよいですよね・・・
それな、なぜなんでしょうか?
0
本来は
String s = new String("Java")
のところを
特別に
String s = "Java"
で許されているのが
Stringクラス君です。
では、その違いは、、あります。
前者はStringインスタンスがメモリーに配置され、
それを参照するオブジェクトがsです。つまり
オブジェクトは2つ作成されてます。
後者はオブジェクトはひとつ
"Java"はヒープと呼ばれるところにあるのです。
インスタンス化しなくていい理由はそのへんでしょう。たぶん。
0
訂正あり。
オブジェクトの個数のことは忘れてください。
間違いです。
違いは微妙で、
String s = "java"
はプールにある"Java"を参照するs
String s = new String("java")
はメモリー上にあるインスタンス(オブジェクト)を
参照するs
0
"Java"はnew String("Java")とされることが暗黙に判っているので、コードに書く手間を省こうというところでしょう。
以下の一文からも読み取れるのだろうと思います。
# 3.10.5 String Literals
# Each string literal is a reference to an instance of class String.
逆に"Java"という書き方が許されておらず、いちいちnew String("Java")と書きなさいとなっていたら、煩わしく思うのではないのでしょうか。
素直にそう書けると受け取った方がいいと思いますけど。
分析したわけではないですが、new String("Java")とした場合は2つのインスタンスが生成されると考えられるでしょう。
"java"がStringオブジェクトとして扱えるためには、まず"java"がStringオブジェクトとして生成されている必要があるからです。
0
>素人ですので、やさしくお願いします。
こういうことを書くと、やさしくどころか、逆効果にもなりえますよ。
返信が理解できなくて、調べても分からなかったら、その時点で再質問するようにしましょう。
String s = "Java";
String t = "Java";
こうすると、まずクラスの初期化時にnew String("Java")が暗黙に実行され、配置されます。
その後、sとtにそのインスタンスへの参照が入ります。
全体のインスタンスは1つです。
String s = new String("Java");
String t = new String("Java");
これも、最初に実行されるnew String("Java");は一緒ですが、そのStringを使ってさらにnew String()が2回実行されます。
最初のnew String("Java")とsとtとは、それぞれ別のインスタンスになります。つまりインスタンスは3つです。
質問から6ヶ月以上経過しているので、回答を書き込むことはできません。