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. この種の初期化は、ユーザーが作成したクラスにも許可されていますか?
いいえ。