JVM学习笔记10: 初始化对于类和接口的异同点深入解析

这一篇比较难理解,没有什么文字描述,只有看视频,反而更容易明白

结论:

在初始化一个类时,并不会先初始化它所实现的接口;

在初始化一个接口时,并不会先初始化他的一个父接口!!!


 

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");//所以这个可以检验是否被初始化了。
        }
    };


}
//以上部分说明了,在初始化一个接口时,并不会先初始化他的一个父接口

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值