Q1. それがプリミティブなデータ型であれば理解できますが、これはクラス型にとって何を意味するのでしょうか?
この場合、"TestString"
は文字列リテラルです。文字列リテラルは、 のインスタンスへの参照としてもString
機能します。これは、言語仕様§3.10.5 によるものです。したがって、特定のケース"TestString"
では、のインスタンスへの参照でありString
、同じ参照を変数に割り当てていますs
。
String
ここで、リテラルによって参照される sについて、かなり特別なことがいくつかあります。同じ値 (論理的には文字列として) を持つ 2 つの文字列リテラルは、常に の同じインスタンスを参照しますString
。これは、文字列リテラルの「インターン」によるものです。
しかし、あなたが言うとき
String s = new String("TestString");
"TestString"
のインスタンスString
、実際には文字列インターン プール内のインスタンスを参照する場合でも、同じ文字列を参照する場合ではありません。s
代わりに、s
その値が と等しくなるように初期化されます"TestString"
が、実際には新しい参照です。あれは:
String s = new String("TestString");
String t = "TestString";
System.out.println(s == t);
これは印刷されますfalse
。
Q2. この種の初期化は、ユーザーが作成したクラスにも許可されていますか?
いいえ。