美文网首页JavaSE学习笔记
Java类及对象的初始化顺序

Java类及对象的初始化顺序

作者: Aruforce | 来源:发表于2017-08-29 19:29 被阅读0次

1.初始化规则:

下面规则优先级从前往后依次降低
0.加载一个类时先初始化基类后初始化扩展类;
1.类的初始化高于对象的初始化;
类的初始化依靠静态代码(被static标识的),静态代码块、静态变量这些用于初始化类的成员只会被加载执行一次;
对象的初始化依靠对象成员变量、代码块、构造方法,这些在对象每次被创建时都要执行一次;
2.变量声明执行优先级高于代码块执行,代码块高于构造函数;
3.声明顺序和执行顺序一致;

2.测试性代码

public class DemoTest {
    public static void main(String[] args) throws ClassNotFoundException {
        DemoBase obj1 = new DemoBaseExtends();
        DemoBase obj2 =  new DemoBaseExtends();
        obj1.toString();
        obj2.toString();
    }
    
}
class DemoBase{
    
    static{
        System.out.println("DemoBase static called1");
        i = 1;
    }
    {
        System.out.println("DemoBase object called1");
    }
    public DemoBase() {
        System.out.println("DemoBase constu called");
    }
    {
        System.out.println("DemoBase object called2");
    }
    static{
        System.out.println("DemoBase static called2");
        i = 1;
    }
    
    static final String str = "qwer";
    static int i;
}
class DemoBaseExtends extends DemoBase{
    String name = null;
    static{
        System.out.println("DemoBaseExtends static called1");
    }
    {
        System.out.println("DemoBaseExtends Object called1");
        name = "DemoBaseExtends";
    }
    public DemoBaseExtends() {
        super();
        System.out.println("DemoBaseExtends constu called");
    }
    {
        System.out.println("DemoBaseExtends Object called2");
    }
    static{
        System.out.println("DemoBaseExtends static called2");
    }
}
/**
DemoBase static called1
DemoBase static called2
DemoBaseExtends static called1
DemoBaseExtends static called2
DemoBase object called1
DemoBase object called2
DemoBase constu called
DemoBaseExtends Object called1
DemoBaseExtends Object called2
DemoBaseExtends constu called
DemoBase object called1
DemoBase object called2
DemoBase constu called
DemoBaseExtends Object called1
DemoBaseExtends Object called2
DemoBaseExtends constu called
*/

3.汇总

基类静态变量(按声明顺序)=》
基类静态代码块(按声明顺序)=》
扩展类静态变量(按声明顺序)=》
扩展类静态代码块(按声明顺序)=》
基类实例变量(按声明顺序)=》
基类实例代码块(按声明顺序)=》
基类构造函数(按调用顺序)=》
扩展类实例变量(按声明顺序)=》
扩展类实例代码块(按声明顺序)=》
扩展类构造函数(按调用顺序)

相关文章

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • Java类/对象初始化及顺序

    在Java中,要区分一下类和对象。对象必须基于类创建,但是不创建对象,也可以使用类中的某些成员和方法(如stati...

  • Java类及对象的初始化顺序

    1.初始化规则: 下面规则优先级从前往后依次降低0.加载一个类时先初始化基类后初始化扩展类;1.类的初始化高于对象...

  • C++对象模型5——对象的构造/析构

    对象的构造/析构顺序 初始化虚基类,按照继承顺序,从左到右,从最深到最浅。 初始化按照继承顺序初始化父类,如果父类...

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • 单例:静态内部类和DCL实现

    1.DCL 2.静态内部类 先了解一下java内部类及类加载顺序:变量定义的先后顺序决定初始化顺序,而在不同变量之...

  • java面向对象——类的初始化顺序

    理论知识: 1.创建一个对象的顺序:首先先创建对象的属性,之后才调用构造函数,最后才完成对象的创建。 2.特别注意...

  • JAVA的类加载顺序

    理解关于java类的加载顺序 首先来捋一捋java类的加载顺序吧 父类静态代码块 》》静态代码初始化,静态属性(带...

  • Kotlin笔记

    Kotlin与Java的差异 1. 对象的初始化时的顺序 在java中,初始化代码块 -> 构造函数 在kotli...

  • 初始化

    成员方法的初始化 在类的内部,变量的定义顺序决定了初始化的顺序。创建一个对象时,会先初始化对象中的成员变量,然后才...

网友评论

    本文标题:Java类及对象的初始化顺序

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