Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

String型の変数をインスタンス化しなくてよいわけ?

Javaを勉強中に疑問に思いました。
素人ですので、やさしくお願いします。

<質問>
 String s = "Java"はインスタンス化しなくてもよいですよね・・・
 それな、なぜなんでしょうか?

4

回答

82100

閲覧

4件の回答

評価

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ヶ月以上経過しているので、回答を書き込むことはできません。