平時看代碼時,總是碰到這些即熟悉又陌生的名次,每天都與他們相見,但見面後又似曾沒有任何的交集,所以今天我就來認識下這兩個江湖俠客的背景:
CLASS
在Java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成後,在生成的.class文件中,就會產生一個Class對象,用於表示這個類的類型信息
獲取Class實例的三種方式:
(1)利用對象調用getClass()方法獲取該對象的Class實例;
(2)使用Class類的靜態方法forName(),用類的名字獲取一個Class實例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
(3)運用.class的方式來獲取Class實例,對於基本數據類型的封裝類,還可以采用.TYPE來獲取相對應的基本數據類型的Class實例
在newInstance()調用類中缺省的構造方法 ObjectnewInstance()(可在不知該類的名字的時候,常見這個類的實例) Creates a new instance of the class represented by this Classobject.
在運行期間,如果我們要產生某個類的對象,Java虛擬機(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據類的名稱找到.class文件並加載它。一旦某個類型的Class對象已被加載到內存,就可以用它來產生該類型的所有對象
Class對象的生成方式如下:
1.Class.forName("類名字符串") (注意:類名字符串必須是全稱,包名+類名);
2.類名.class;
3.實例對象.getClass();
package baseJava;
public class TestClass {
/**
* @param args
* 2013-4-11 上午10:30:05
* @author zhao_xingcai
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//測試Class.forName()
Class classForName = Class.forName("baseJava.TestClass");
System.out.println("classForName : [" + classForName + "]");
//測試類名.class
Class classForName2 = TestClass.class;
System.out.println("classForName2 : [" + classForName2 + "]");
//測試Object.getClass()
TestClass newInstance = new TestClass();
System.out.println("newInstance : [" + newInstance.getClass() + "]");
//hashCode指的是內存的地址
System.out.println("newInstanceHashCode : [" + newInstance.hashCode() + "]");
//toString代表該對象的一個字符串
//格式:this.getClass().getName() + '@' + Integer.toHexString(hashCode())
System.out.println("newInstanceToString : [" + newInstance.toString() + "]");
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 構造函數
*/
public TestClass() {
System.out.println(" 構造函數");
}
/*
* 靜態的參數初始化
*/
static {
System.out.println("靜態的參數初始化 ");
}
/*
* 非靜態的參數初始化
*/
{
System.out.println("非靜態的參數初始化 ");
}
}
運行結果如下:
靜態的參數初始化
classForName : [class baseJava.TestClass]
classForName2 : [class baseJava.TestClass]
非靜態的參數初始化
構造函數
newInstance : [class baseJava.TestClass]
newInstanceHashCode : [12677476]
newInstanceToString : [baseJava.TestClass@c17164]
也就是說:
三種方法生成CLASS對象是一樣的,因為CLASS在JVM的名稱是一樣的,但是三種生成的方法略有不同:靜態的方法屬性初始化,是在加載類的時候初始化。而非靜態方法屬性初始化,是new類實例對象的時候加載。當我們編寫一個新的JAVA類時,JVM就會幫我們編譯成CLASS對象,存放在同名的.class文件中,在運行時,當需要生成這個類的對象時,JVM就會檢查此類是否裝載到內存中,會沒有裝載,就把.class裝載到內存中,若裝載過,則根據.class生成對象。