- ベストアンサー
Threadクラスのメソッドの使用方法について
Threadクラスのメソッドの使用方法について質問させていただきます。 Thread th = currentThread(); System.out.println("Thread Name = " + th.getName() ); というコーディングにおいて、Thread th = currentThread();は、 currentThreadメソッドがstaticなのでnewしないで使用しているのは分かるのですが、 th.getName()は、staticでないのに、newせずに使用できるのがなぜか分かりません。 どなたか宜しくご教示お願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
thは、Thread(あるいはその派生クラス)のインスタンス、あるいはnullを指し示す変数です。つまり、これに代入できるものは何らかのThreadクラスのインスタンスです。 ところで、Javaという言語においてnewキーワードはあるクラスのインスタンスをヒープメモリに作成するものですが、これは表に出てこない場合もあります。もちろんJava的にはどこかで必ずnewされています。仮にnative(JavaじゃなくてC言語などで記述されているOSやCPUに対するネイティブコード)であっても、どこかでJava的にnewされています。 ぱっと見newがないからどこにもnewがないという訳ではありません。 例えば、BigDecimalクラスにはZEROというBigDecimalクラスのインスタンスを返却するpublic static finalな変数がありますが、これは内部でnewされたnew BigDecimal(0)と同じ値のBigDecimalのインスタンスを返却します。 例:BigDecimal bdec = BigDecimal.ZERO; これもnewという言葉は見つかりませんが、BigDecimal.ZEROは確かに0をあらわすBigDecimalのインスタンスを指し示しており、それがbdecに代入されます。 前置きが長くなりましたが、Thread.currentThread();は既に作成されたThreadインスタンスを、それ自身の中から自分自身を取得する(ややこしい)ものです。Thread.currentThread()で得られるThreadは、Thread.currentThread()で取得できる段階では既に誰かの手によってnewされている訳です。なのでそれをthに代入しているのですから、thは存在するインスタンスを指しており、th.getName()でそのインスタンスのgetNameメソッドを呼び出すことができるのです。 上手にnewを隠すという話はシングルトンパターン、ファクトリーパターンなどのデザインパターンを調べてみると良いでしょう。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
「static でない」ということは「対象とするオブジェクトを指定しなければならない」ということです. 「対象とするオブジェクト」が new で作られたものであるかどうかは関係ありません.
お礼
ご回答ありがとうございます。 「対象とするオブジェクト」がnewで作られたかどうかでは関係なく、オブジェクトとして存在しているかどうか が重要なんですね。 勉強になりました。 ありがとうございました。
お礼
ご回答ありがとうございます。 newを隠すという概念がなかったので、混乱してしまっていました。 BigDecimal の例の通り、newがなくとも、そのインスタンスを指し示すんですね。 勉強不足でした。 また、デザインパターンも教えていただきありがとうございます。 さっそく勉強してみます。 本当にありがとうございました。