答案是:不一定!
1.如下代碼運行:
package com.java.oop;
/**
* 類加載時一定會執行靜態代碼塊嗎?不一定
*/
class ClassC{
static {
System.out.println("ClassC.static");
}
}
class ClassD extends ClassC{
static {
System.out.println("ClassD.static");
}
}
public class TestClassObject04 {
public static void main(String[] args)throws Exception {
ClassLoader loader=
ClassLoader.getSystemClassLoader();
loader.loadClass("com.java.oop.ClassC");
}
}
如下方式運行:
VM argument框輸入參數-XX:+TraceClassLoading 然後run
如下結果
可以看到類被加載了,但是沒有執行ClassC中靜態代碼塊.
2.如下代碼運行
package com.java.oop;
/**
* 類加載時一定會執行靜態代碼塊嗎?不一定
*/
class ClassC{
static int c=100;
static {
System.out.println("ClassC.static");
}
}
class ClassD extends ClassC{
static int d=200;
static {
System.out.println("ClassD.static");
}
}
public class TestClassObject04 {
public static void main(String[] args)throws Exception {
ClassLoader loader=
ClassLoader.getSystemClassLoader();
Class.forName("com.java.oop.ClassC");
}
}
靜態代碼塊執行.
3.如下代碼運行
package com.java.oop;
/**
* 類加載時一定會執行靜態代碼塊嗎?不一定
*/
class ClassC{
static int c=100;
static {
System.out.println("ClassC.static");
}
}
class ClassD extends ClassC{
static int d=200;
static {
System.out.println("ClassD.static");
}
}
public class TestClassObject04 {
public static void main(String[] args)throws Exception {
ClassLoader loader=
ClassLoader.getSystemClassLoader();
Class.forName("com.java.oop.ClassC",
false,//true表示要對類變量初始化,執行靜態代碼塊,false反之.
loader);
}
}
靜態代碼塊不執行;但是如把false改爲true
Class.forName("com.java.oop.ClassC",
true,//true表示要對類變量初始化,執行靜態代碼塊,false反之.
loader);
ClassC靜態代碼塊執行.
4.如下代碼運行
package com.java.oop;
/**
* 類加載時一定會執行靜態代碼塊嗎?不一定
*/
class ClassC{
static int c=100;
static {
System.out.println("ClassC.static");
}
}
class ClassD extends ClassC{
static int d=200;
static {
System.out.println("ClassD.static");
}
}
public class TestClassObject04 {
public static void main(String[] args){
//如下輸出,ClassD爲被動加載,其內部靜態代碼塊不會執行
System.out.println(ClassD.c);//方法ClassC屬性
}
}
ClassD爲被動加載,其內部靜態代碼塊不會執行
5.如下代碼運行
package com.java.oop;
/**
* 類加載時一定會執行靜態代碼塊嗎?不一定
*/
class ClassC{
static int c=100;
static {
System.out.println("ClassC.static");
}
}
class ClassD extends ClassC{
static int d=200;
static {
System.out.println("ClassD.static");
}
}
public class TestClassObject04 {
public static void main(String[] args){
//如下輸出,ClassD爲主動加載,其內部靜態代碼塊會執行.
System.out.println(ClassD.d);//訪問自身屬性
}
}
ClassD爲主動加載,其內部靜態代碼塊會執行.