美文网首页
初始化对于类与接口的异同点

初始化对于类与接口的异同点

作者: 龙剑灵 | 来源:发表于2019-12-05 00:33 被阅读0次

当Java 虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。
在初始化一个接口时,并不会先初始化它的父接口。
在初始化一个类时,并不会先初始化它所实现的接口。
因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。

示例1:

public class MyTest5 {
    public static void main(String[] args) {
        System.out.println(MyChild5.b);
        new C();
        new C();
    }
}
//接口中的常量 默认是 final, 类中的常量如果没定义为final那它就不是final
interface MyParent5 {
    //public static int a = new Random().nextInt(3);
    public static int a = 5;
}
interface MyChild5 extends MyParent5 {
    public static int b = 6;
}

class C {
    static {  //AA
        System.out.println("hello");
    }
    public C(){
        System.out.println("c");
    }
}

此处结果输出为

6
hello
c
c

分析:
若将AA处的static去掉, 则每次在new C()时, AA处的代码块都会执行

示例2

在初始化一个接口时,并不会先初始化它的父接口。所以此出的输出结果是 6

public class MyTest51 {
    public static void main(String[] args) {
        System.out.println(MyChild51.b);
    }
}

//接口中的常量 默认是 final, 类中的常量如果没定义为final那它就不是final
interface MyParent51 {
    public static Thread thread = new Thread(){
        {
            System.out.println("MyParent51  new thread...");
        }
    };
}

interface MyChild51 extends MyParent51 {
    public static int b = 6;
}

若此处是子类继承接口, 在初始化一个类时,并不会先初始化它所实现的接口
下面示例较上面例子做了修改,由子类继承接口, 此处输出同样是 6

public class MyTest51 {
    public static void main(String[] args) {
        System.out.println(MyChild51.b);
    }
}

//接口中的常量 默认是 final, 类中的常量如果没定义为final那它就不是final
interface MyParent51 {
    public static Thread thread = new Thread(){
        {
            System.out.println("MyParent51  new thread...");
        }
    };
}

class MyChild51 implements MyParent51 {    //此处修改--------------------
    public static int b = 6;
}

示例3

此例子是 子类继承父类, 会导致父类先初始化, 输出结果为:
MyParent51 new thread...
6

public class MyTest51 {
    public static void main(String[] args) {
        System.out.println(MyChild51.b);
    }
}

//接口中的常量 默认是 final, 类中的常量如果没定义为final那它就不是final
class MyParent51 {
    public static Thread thread = new Thread(){
        {
            System.out.println("MyParent51  new thread...");
        }
    };
}

class MyChild51 extends MyParent51 { //此行有修改
    public static int b = 6;
}

相关文章

  • 03_JVM学习笔记_类加载机制详解三

    初始化对于类与接口的异同点 示例代码 输出 修改代码如下: 输出 结论 在初始化一个类时,并不会先初始化它所实现的...

  • 初始化对于类与接口的异同点

    当Java 虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。在初始化一个接口时,...

  • 梳理一

    1、抽象类和接口的异同点? 相同点 都是不断向上抽取而来的。 不同点 抽象类需要被继承,而且只能单继承。接口需要被...

  • 软件测试面试准备-Java篇

    面试题:接口与抽象类的区别相同点(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的...

  • 接口初始化规则

    在我们初始化一个类的时候,会先初始化它的父类,但是对于接口不是这样的,在初始化一个类时,并不会先初始化它所实现的接...

  • 【极客班】Swift高级编程二

    结构与枚举 类与结构的异同:相同点:都可以定义以下成员:属性、方法、下标、初始化器;都支持类型扩展、协议。不同点:...

  • java重要的知识点!

    接口和抽象类的区别是什么? Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于: 接口中所有的方法...

  • [Swift进阶]类与结构体的探究(上)

    本文学习和实践了Swift当中的类(Class)与结构体(Struct)。包含基本语法,异同点。类的初始化和生命周...

  • bean的生命周期

    配置文件 接口 实现类 初始化类 测试类

  • 接口与抽象类的异同点

网友评论

      本文标题:初始化对于类与接口的异同点

      本文链接:https://www.haomeiwen.com/subject/packgctx.html