私が呼び出すときSystem.out.println(new Date());
、クラスでコンストラクターを呼び出していませんDate
か? 間違っている場合は修正してください。その場合、どのように値を返しますか?
4 に答える
toString
新しく構築されたオブジェクトのメソッドを暗黙的に呼び出しているため、値が出力されDate
ます。
これは次と同等です。
Date date = new Date();
System.out.println(date);
もちろん、Date コンストラクターを呼び出しています。「new」演算子を使用するたびに、コンストラクターが呼び出されます。新しく作成されたオブジェクトへの参照を保存していないだけなので、すぐにガベージコレクションされます。したがって、何が起こるかは次のとおりです。
- 日付コンストラクタが呼び出されます
- Date のインスタンスは、Object 引数を取る println メソッドに渡されます。
- println メソッドは、日付で toString() メソッドを呼び出し、文字列表現を取得します。それを印刷します
- メソッドが返され、日付のインスタンスがガベージ収集されます(最終的に)
前述のように、実際にはDate()
クラスのコンストラクターを呼び出しており、暗黙的にそのtoString()
メソッドを呼び出しています。そのメソッドが何をするかを知りたい場合は、ここを参照してください。
コンストラクターは、システム時間をミリ秒単位 (明らかに数十ミリ秒単位) として取得し、 で使用可能なメソッドを参照してそれlong
をtoString()
解析し、sun.util.calendar.CalendarDate
最終的に返される StringBuilder オブジェクトを生成します。
したがって、Date()
オブジェクトのコンストラクターを呼び出している (そして暗黙的にそのtoString()
メソッドを呼び出している) 間、内部ではさらに多くの処理が行われています。ここでの動機が独自の日付パーサーを作成することである場合は、関連するクラスのソースを参照して確認するか、単にこれらのクラスを呼び出して作業を任せることができます。
new Date()
コンストラクター呼び出しである式です。
このような式の結果は、新しく構築されたオブジェクトであることが保証されています。(または例外)