Java对象初始化过程

2021-08-09 14:57

阅读:831

标签:自动   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


评论


亲,登录后才可以留言!