• ベストアンサー

Class.forNameって?

Class t = Class.forName("java.lang.Thread"); と Thread t=new Thread(); の 違いを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

いきなりで申し訳ないですが、まず訂正です。 Thread t = Class.forName("java.lang.Thread").newInstance(); ではなくて Thread t = (Thread) Class.forName("java.lang.Thread").newInstance(); でした。失礼いたしました。 さて前の回答の補足についてですが、実際には、単純にクラスをインスタンス化するのに、いちいち Thread t = (Thread) Class.forName("java.lang.Thread").newInstance(); というような長い命令を書かなくても、 Thread t = new Thread(); と書くだけで十分です。 ただ、上の newInstance() を使う方法が完全に無意味であるかというと、そうでもないのです。 new Thread() と書くと、インスタンス化されるクラスはコンパイルの時点で Thread に固定されてしまいますが、場合によっては、どのクラスをインスタンスかするのか実際にプログラムを動かしてみるまでわからないということもあります。 こういう場合、例えば Object obj; if ("java.lang.Object".equals(className)) { obj = new Object(); } else if ("java.lang.Thread".equals(className)) { obj = new Thread(); } else if ("java.lang.String".equals(className)) { obj = new String(); } というようにいちいち書き分けるよりも、 Object obj = Class.forName(className).newInstance(); と書いたほうが分かりやすく、かつ柔軟に対応できるのです。こういう場面では、newInstance() が活躍します。

その他の回答 (2)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

ややこしいようですが、実は全く違います。 Class t = Class.forName("java.lang.Thread"); は、Threadクラスに対応するClassクラスのインスタンスを取得しています。 Classクラスは、「クラスを表すクラス」です。 この場合では、Threadクラスを表す、Classクラスのインスタンスを取得しています。ここでは、Threadクラスのインスタンスは登場しません。 Thread t=new Thread(); は、実際にThreadクラスのインスタンスを作成しています。ここでは、Classクラスは登場しません。 さらにややこしい話をして申し訳ないですが、Threadクラスを表すClassクラスのインスタンスから、実際のThreadクラスのインスタンスを作ることもできます。つまり、 Thread t = Class.forName("java.lang.Thread").newInstance(); と Thread t = new Thread(); は同じ結果になります。

keyguy
質問者

補足

ありがとうございます。 Thread t = Class.forName("Thread").newInstance(); をときどきみるのですが敢えて Thread t = new Thread(); と書かないのは何か意図があるのでしょうか? いっぱい書かなければならないのでメリットが無いと不合理だと思うのですが。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

>Class t = Class.forName("java.lang.Thread"); tはThreadというクラスそのもの コンストラクタは呼ばれていない メンバ等はまだ実態が存在しない >Thread t=new Thread(); tはインスタンス化されたThreadクラスのオブジェクト コンストラクタが呼ばれている

keyguy
質問者

お礼

ありがとうございます。