java创建对象过程 实例化和初始化

 

我们先看看类的加载过程,

java创建对象过程 实例化和初始化_第1张图片

 

上图只是类的加载过程,还没有创建对象; 那如果创建对象的话,里面主要有2个步骤,分别是实例化和初始化

java创建对象过程 实例化和初始化_第2张图片

 

实例化

对象实例化的过程,首先会为该对象分配一块堆内存用来存放对象和父类的属性实例,并且给对象和父类的属性进行复制,这里的赋值都是给默认值,也就是零值;

java创建对象过程 实例化和初始化_第3张图片

 

初始化

初始化就需要给属性赋值真正的数据了,这个数据是用户给定的,如果是引用的话,就会将引用变量指向给定的地址,并且调用初始化方法

init() 方法:就是我们说的构造器,构造器就包括 构造方法、{}包住的代码等。

clinit()方法: ()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}语句)中的语句合并产生的,编译器收集的顺序是有语句在源文件中出现的顺序所决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块中可以赋值,但不能访问。
java创建对象过程 实例化和初始化_第4张图片

 

init() 与 clinit() 加载顺序

当一个类初始化的时候,先调用方法 ,如果在方法中遇到方法。则先调用完方法。然后在继续执行

 

我们用用代码测试下

package com.test;

/**
 * 类初始化
 */
public class Init {

    public static void main(String[] args) {
        ChildClass childClass = new ChildClass();
    }
}


class  ChildClass extends ParentClass{

    static {
        System.out.println("我是子类的静态方法");
    }

    public ChildClass(){
        System.out.println("我是子类的构造函数");
    }
}

class ParentClass{
    static {
        System.out.println("我是父类的静态方法");
    }

    public ParentClass(){
        System.out.println("我是父类的构造函数");
    }

}

打印结果

我是父类
我是子类
我是父类的构造函数
我是子类的构造函数

 

你可能感兴趣的:(java创建对象过程,对象的实例化和初始化)