在看書過程中,對靜態代碼塊的有些迷糊,只是知道靜態塊優先類構造函數執行,類第一次用 new 或者直接 [類.staticMethod]會觸發靜態塊的執行。但是
Class.forName("com.thq.statics.Static");上面這條語句會不會觸發靜態塊的執行呢?答案是肯定的,會觸發的(前提:在同一個類加載中只有第一次調用的時候起作用),上述方法在類加載器中查找并加載類用例子說明:
1 、父類 只含有靜態代碼塊
  
package com.thq.statics;public class ParentStatics {	static{		System.out.PRintln("正在執行父類的靜態方法塊");	}}2、 子類package com.thq.statics;public class Static extends ParentStatics {	static{		System.out.println("正在執行 子類的 static代碼塊");	}		public static void println(){		System.out.println("正在執行靜態方法:println() ");	}}3、測試類
package com.thq.statics;public class StaticMain {	public static void main(String[] args) throws ClassNotFoundException {		Class.forName("com.thq.statics.Static");		Class.forName("com.thq.statics.Static");	}}4.結果
綜上  Class.forName() 不管調用多少次,靜態塊只會執行一次,這也說明靜態塊,靜態方法,靜態變量 只屬于Class,而不是類實例。
Class.forName()  會去查找并加載類,所以在類加載的時候觸發靜態塊,先執行父類的靜態塊,再執行子類的。
注:執行一次,前提是在同一個類加載器中,這點很重要。
最后,jdbc 注冊 MySQL驅動器時,就采用靜態塊的形式
package com.thq.mybatis;import java.sql.SQLException;public class MysqlJdbc {	public static void main(String[] args) throws ClassNotFoundException, SQLException {		Class.forName("com.mysql.jdbc.Driver");		//java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver()); mysql 驅動已經幫我們做了哈。。。	}}查看com.mysql.jdbc.Driver源碼 

在靜態塊中注冊mysql驅動器
完畢
新聞熱點
疑難解答