先看代码及运行结果:
/**
* 接口
* @author z_hh
* @time 2018年8月12日
*/
public interface Reader {
// 默认public static final
String INTERFACE_FINAL_VAR = getAction();
static String getAction() {
System.out.println("加载接口常量");
return "我在读《金瓶梅》";
}
// 默认public abstract
void read();
}
/**
* 爸爸
* @author z_hh
* @time 2018年8月12日
*/
public class Parent {
private static final String PARENT_STATIC_FINAL_VAR = "爸爸常量";
private static String PARENT_STATIC_VAR = "爸爸静态变量";
private String PARENT_VAR = "爸爸成员变量";
static {
System.out.println("爸爸静态代码块:PARENT_STATIC_FINAL_VAR=" + PARENT_STATIC_FINAL_VAR + ";PARENT_STATIC_VAR=" + PARENT_STATIC_VAR);
}
{
System.out.println("爸爸代码块:PARENT_VAR=" + PARENT_VAR);
}
public Parent() {
System.out.println("爸爸构造器:PARENT_VAR=" + PARENT_VAR);
}
}
/**
* 儿子
* @author z_hh
* @time 2018年8月12日
*/
public class Son extends Parent implements Reader {
private static final String SON_STATIC_FINAL_VAR = "儿子常量";
private static String SON_STATIC_VAR = "儿子静态变量";
private String son_var = "儿子成员变量";
static {
System.out.println("儿子静态代码块:SON_STATIC_FINAL_VAR=" + SON_STATIC_FINAL_VAR + ";SON_STATIC_VAR=" + SON_STATIC_VAR);
}
{
System.out.println("儿子代码块:son_var=" + son_var);
}
public Son() {
System.out.println("儿子构造器:son_var=" + son_var);
}
public static void method() {
System.out.println("我是静态方法");
}
@Override
public void read() {
System.out.println(INTERFACE_FINAL_VAR);
}
}
public class Test {
public static void main(String[] args) throws Exception {
// 加载类,并且初始化
Class<?> clazz = Class.forName("cn.zhh.jvm.class_load.Son");
System.out.println("------------------------------------");
System.out.println("父类:" + clazz.getSuperclass());
System.out.println("------------------------------------");
// 创建实例
Object son = clazz.newInstance();
System.out.println("------------------------------------");
// 调用read方法
Method read = clazz.getMethod("read");
read.invoke(son);
}
}
结论:
1、类初始化时先初始化父类的常量、静态变量、静态代码块。
2、类实例化对象时,先执行父类的构造代码块和构造函数(默认为无参)。
3、类实现的接口使用时才初始化。