答案是:不一定!
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为主动加载,其内部静态代码块会执行.