public class Main {
static{
System.out.println("Class Main loaded");
}
public Main(){
System.out.println("create a instance of A");
}
public static void main(String[] args) throws Exception{
Class.forName("j13_5.Main");
}
}
输出:
Class Main loaded
create a instance of Main
从这里可以看的出, Class.forName()是能使Main类中的static block中的命令执行。
package j13_5;
public class Main {
static{
System.out.println("Class Main loaded");
}
public Main(){
System.out.println("create a instance of Main");
}
public static void main(String[] args) throws Exception{
//Class.forName("j13_5.Main");
Main a = new Main();
Main b = new Main();
}
}
输出:
Class Main loaded
create a instance of Main
create a instance of Main
从这里可以看出,new也会使Main类中的static block中的命令执行,不过只执行一次。
我想说明的是连接MySql数据库的时候,Class.forName("com.mysql.jdbc.Driver")的作用,执行static block中的命令,其目的是为了使将Driver对象注册到DriverManager中,保证相应的Driver类已经被加载到 jvm中。
package com.mysql.jdbc
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// --------------------------------------------- // A
// Register ourselves with the DriverManager
//
static {
t ry { //使将Driver对象注册到DriverManager中
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// ~ Constructors
// -----------------------------------------------------------
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}