码迷,mamicode.com
首页 > 编程语言 > 详细

Java对象初始化过程

时间:2021-06-29 15:28:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:自动   sub   null   this调用   顺序   构造   成员变量   jvm   选项   

Java为对象初始化提供了多种选项。

当new一个对象的时候,对象初始化开始:

1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时,

  • 静态字段默认初始化

    声明为static的静态字段会被初始化为默认值:数字为0,布尔值为false,对象为null

  • 静态字段显式初始化

    如果statis字段有显式赋值,就执行显式初始化

  • 静态代码块

    静态代码块可以有任意多个,它们的执行顺序就是在类中声明的顺序

2.类加载完毕,然后以下代码(每次new对象都会执行),

  • 默认字段初始化

    成员变量首先会自动地的被初始化为默认值:数字为0,布尔值为false,对象为null。

    局部变量不会被自动初始化,使用前必须先进性赋值。

  • 显式字段初始化

  • 初始化块

    初始化块可以有任意多个,其执行顺序就是它们在类中声明的顺序

3.构造器初始化

  • 如果在构造器中使用this调用了另一个构造器,就执行被调用的构造器

  • 然后,执行构造器中的代码

4.如果一个类继承了另一个类(当然,任意类都直接或间接的继承自Object),在构造器初始化时,有所不同

  • 如果派生类中的构造器使用super调用了超类中的构造器,

    首先会先加载超类(只会加载一次),执行静态字段初始化与静态初始化块;
    然后,执行超类中的字段初始化与初始化块;
    接着,执行被调用的超类构造器中的代码;
    最后,执行当前类构造器中的代码。

  • 如果没有使用super调用超类中的构造器,JVM会调用超类中的默认(无参)构造器,其执行顺序同上。

    所以,如果超类中没有无参构造器(定义了有参构造器),并且子类构造器中没有使用super调用超类中的有参构造器,编译器会报错。

演示代码

public class MyClass {
    private int i=0;
    private String s=null;
    private static int id=0;

    static {
        System.out.println("静态初始化块 1");
    }

    static {
        System.out.println("静态初始化块 2");
    }

    {
        System.out.println("初始化块 1");
    }

    {
        System.out.println("初始化块 2");
    }

    public MyClass() {
        this(0,"");
        System.out.println("MyClass()");
    }

    public MyClass(int i, String s) {
        System.out.println("MyClass(int,String)");
        this.i = i;
        this.s = s;
    }

    public static void main(String[] args) {
        new MyClass();
    }
}

public class MySubClass extends MyClass
{
    private int b=0;

    public MySubClass()
    {
        System.out.println("MySubClass()");
    }

    public MySubClass(int i,String s,int b)
    {
        super(i,s);
        this.b = b;
        System.out.println("MySubClass(int,String,int)");
    }

    public static void main(String[] args)
    {
        new MySubClass();
        new MySubClass(0,"",0);
    }
}

Java对象初始化过程

标签:自动   sub   null   this调用   顺序   构造   成员变量   jvm   选项   

原文地址:https://www.cnblogs.com/lypzzzzz/p/14947931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!