这一篇比较难理解,没有什么文字描述,只有看视频,反而更容易明白
结论:
在初始化一个类时,并不会先初始化它所实现的接口;
在初始化一个接口时,并不会先初始化他的一个父接口!!!
package com.shengsiyuan.jvm.classloder;
import java.util.Random;
//当一个接口在初始化的时候,并不要求其父接口都完成了初始化
//只有在真正使用到父接口的时候(如引用接口中所定义的常量时),才会初始化
public class MyTest5 {
public static void main(String[] args) {
//new C();//通过这个看出是否初始化,很有才
//new C(); //hello //C //hello //C
System.out.println(MyChild5.b);
}
}
interface MyGrandpa {
//public static final int a=5;//在接口中变量默认是 public static final的,所以可以不写,点击会发下报冗余
// public static final int a=new Random().nextInt(5);
//public static final int a=5;
public static Thread thread=new Thread(){
{
System.out.println("MyGrandpa invoked");//所以这个可以检验是否被初始化了。
}
};
}
interface MyParent5 extends MyGrandpa{
//public static final int a=5;//在接口中变量默认是 public static final的,所以可以不写,点击会发下报冗余
// public static final int a=new Random().nextInt(5);
//public static final int a=5;
public static Thread thread=new Thread(){
{
System.out.println("MyParent5 invoked");//所以这个可以检验是否被初始化了。
}
};
}
class MyChild5 implements MyParent5{
public static final int b= 6;
//public static final int b=6;
}
//但是他的父类都是会被加载的,加载后,分配内存空间,才会被初始化,这个过程可以通过,删除build后的文件,发现报错,
//当然最显而易见的是通过-XX:+TraceClassLoading,来跟踪就可以看出
//这个说明了在初始化一个类时,并不会先初始化它所实现的接口
/*
class MyChild5 implements MyParent5{
public static int b= 6;
}
//是需要被加载的,因为在接口中默认是final的,但是在类中不是的
*/
class C{
{
System.out.println("hello");//这个是每创造一个实例都会执行,并且比构造方法先执行
}
public C(){
System.out.println("C");
}
}
interface MyGrandpa1 {
//public static final int a=5;//在接口中变量默认是 public static final的,所以可以不写,点击会发下报冗余
// public static final int a=new Random().nextInt(5);
//public static final int a=5;
public static Thread thread=new Thread(){
{
System.out.println("MyGrandpa1 invoked");//所以这个可以检验是否被初始化了。
}
};
}
interface MyParent5_1 extends MyGrandpa1{
//public static final int a=5;//在接口中变量默认是 public static final的,所以可以不写,点击会发下报冗余
// public static final int a=new Random().nextInt(5);
//public static final int a=5;
public static Thread thread=new Thread(){
{
System.out.println("MyParent5_1 invoked");//所以这个可以检验是否被初始化了。
}
};
}
//以上部分说明了,在初始化一个接口时,并不会先初始化他的一个父接口