電子書籍の厳選無料作品が豊富!

Class t = Class.forName("java.lang.Thread");

Thread t=new Thread();

違いを教えてください。

A 回答 (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() が活躍します。
    • good
    • 0

ややこしいようですが、実は全く違います。



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();
は同じ結果になります。

この回答への補足

ありがとうございます。

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

補足日時:2004/01/11 19:44
    • good
    • 0

>Class t = Class.forName("java.lang.Thread");


tはThreadというクラスそのもの
コンストラクタは呼ばれていない
メンバ等はまだ実態が存在しない

>Thread t=new Thread();
tはインスタンス化されたThreadクラスのオブジェクト
コンストラクタが呼ばれている
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2004/01/11 19:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!