一、出現的時期不一樣:Class.forName()在運行時加載;Class.class和getClass()是在編譯器加載
二、Class.class只是在編譯時用來存放類的相關信息,並無實例化對象;而getClass()既實例化了對象,又存放了類信息
三、例:
Test t=new Test();
Class c=t.getClass();
Class c=Class.class;
Class c=Class.forName("Test");
package com.hsia.util;
public class Test {
Test(){}
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public static void f(Test t)
{
System.out.print(t);
}
public static void main(String[] arg) throws Exception
{
System.out.println(Test.class);
System.out.println(new Test());
System.out.println(Test.class.newInstance());
Class clas = null;
try {
clas = Class.forName("Test"); //此處必須爲完整路徑 com.hsia.util.Test
System.out.println(clas);
} catch (ClassNotFoundException ex) {
// handle exception case
}
System.out.println(clas);
Test t=new Test();
System.out.println(t.getClass().newInstance());
System.out.println(t);
f(t);
}
}
輸出結果:
第一次輸出:
class com.hsia.util.Test
com.hsia.util.Test@1df38fd
com.hsia.util.Test@16a786
null
com.hsia.util.Test@1efb836
com.hsia.util.Test@126e85f
com.hsia.util.Test@126e85f
第二次輸出:
class com.hsia.util.Test
com.hsia.util.Test@de6ced
com.hsia.util.Test@c17164
null
com.hsia.util.Test@61de33
com.hsia.util.Test@14318bb
com.hsia.util.Test@14318bb
結論:
Test.class:輸出類名
new Test():輸出類實例的內存物理地址
Test.class.newInstance():輸出類實例的內存物理地址
t.getClass().newInstance():輸出類實例的內存物理地址
t:也是類實例內存地址this