创建或实例化对象一般通过“_【Java基础】对象实例化过程

35d0771a26c8c48aaa83982632729447.png

木 头 课 堂

2c2c7ca1184baabfa1242a337ea7e213.png

小 木 正 文

——————————————

❶对象实例化过程

——————————————

        理解Java中对象实例化过程是很重要的,实例化过程主要步骤如下:

        第1步:在创建类之前,检查类是否加载(是将硬盘上的.class文件加载到内存中), 如果没有加载就加载这个类,在这个类加载之前要加载所有父类。

        Java运行时采用的策略:懒惰式加载(按需加载) :如果第一次用到就加载,只加载一次。通过CL ASSPATH指定的路径寻找类文件(.class), 加载以后是一个对象,类型是Class。

        第2步:在内存堆中分配对象空间。递归分配所有父类和子类属性空间。

        属性默认自动初始化。自动初始化为"0"值。

        第3步:进行属性的赋值。

        第4步:递归调用父类构造器。(默认调用父类无参数构造器! )

        第5步:调用本类构造器。

        第1步:检查并加载类首先检查内存中Koo有没有加载,如果Koo没有加载会加载Koo并加载父类Foo。

        第2步:在内存堆中分配对象空间先递归的分配父类型空间(Foo) : int a=0 (int类型空间, 默认值为0)再分配子类型空间(Koo) : int b= 0。

89cdbfd8b5c64382dc77d96e7c613507.png

        第3步:进行属性的赋值。

511e83c3860a556f9927e162cc204114.png

        第4步:递归调用父类构造器。

d5f49f4b56e57d5b9007573d96e61950.png

        第5步:调用本类构造器。

8cc40d9384904b60942bd09df20c6c88.png

        new运算:创建对象实例(共3步)

        第1步根据类的属性在堆中分配对象空间,并且自动初始化实例变量。

7ba5306706a0e268731789f4d6c4f750.png

        第2步根据参数类型调用构造器。

7ca77d99a220371c34f3597dca4ed97b.png

e2b0275bf2dab7770fc4b2d28858ce3a.png

        注: this编译时不存在,运行时才出现。

        第3步new运算返回对象的引用地址。

a8a767584f0f5f50bc4c44277236f658.png

        Java的内存管理与分配

        1、栈是一块Java使用内存区域,使用的方式: LIFO(后来者居上)。

        2、堆也是一块Java使用内存区域,使用方式:随机分配。

        局部变量与堆对象空间分配

        1、Java局部变量和方法参数在栈中分配,大小是按照变量的类型分配。

        2、对象在堆中分配,按照类中声明属性(实例变量)分配空间。

        变量类型与分配

        1、变量分为:基本类型和引用类型。

        2、基本类型变量的空间大小:就是基本类型的空间大小,值是基本类型的值。

        3、引用变量的值是一个对象的地址值,引用变量通过地址引用了一个堆对象。

        4、引用类型变量的占用空间大小和值管理是"透明的(不可看见)"由Java系统管理:变量占用空间以及值的管理,都是透明的。

——————————————

❶构造器的作用

——————————————

        构造器(构造方法)的作用

        构造器(构造方法)的作用:用来描述对象的创建过程的。

        举例说明:

9e70f4fa016d735f488a0b4f67a6a539.png

        Java中的构造器

        构造方法(构造器)要点:

        1、Java中的构造器(构造方法)声明在类内部。

        2、方法名与类名一致的方法叫构造方法。

        3、构造方法不能声明返回值类型。

        4、构造方法可以包含参数,参数一般是创建对象实例必须依赖的条件(前提条件)。

        下面我们写了一个带参数的构造器(构造方法),如下所示:

public class Point2 {    int x;    int y;/***构造器* @param x* @param y*/    public Point2(int x, int y) {        this.x= x;        this.y=y;    }}

        注:常用写法,this的含义后续介绍。

——————————————

❶默认构造器

——————————————

        Java类一定有构造器。

        当使用new关键字时, JVM必定调用构造方法创建对象。

        如果类没有声明任何构造器,Javac自动提供一个。

/***默认构造器java类一定有构造器*/public class ConstructorDemo {      public static void main(String[] args) {          Foo foo = new Foo();      }}class Foo {  // public Foo(){}默认构造器}

        默认构造器,当class中不写构造器时,javac提供一 个无参数默认构造器。

        如果提供构造器声明,Javac将不再提供默认构造器。

        调用默认无参构造器时会出错,而调用自定义有参构造器没有问题。

/***默认构造器java类- 定有构造器*/public class ConstructorDemo2 {      public static void main(String[] args) {            Foo foo = new Foo(); //调用的是默认构造器            // Goo goo = new Goo();没有Goo            Goo goo = new Goo(2); //调用构造器Goo(int a)       }}class Foo {    // public Foo() {}默认构造器}class Goo {        int a;        public Goo(int a) {//如果提供了构造器,javac不提供默认构造器            this.a= a;        }}

——————————————

❶构造方法重载

——————————————

        构造方法重 载即写多个参数不一样的构造器。构造方法重载是为了实现构造方法的重用。

public class Point {    int x;    int y;    /**    *表示对角线上的点    */    public Point(int x) {        this.x = x;//调用本类的构造器,根据参数列表匹配    }    /**    *构造器    * @param x    * @param y    */    public Point(int x, int y) {        this.x= x;        this.y=y;    }}

注:

        1、方法签名=方法名+参数类型列表。

        2、方法重载有如下规则:

            a方法名一样。

            b方法参数不一样。

        3、重载方法也可以说是,方法名一样,方法签名不同的方法。

2c2c7ca1184baabfa1242a337ea7e213.png

无  成 本 赞 赏

生活不易,还请小伙伴多多支持69be331c02cca6a805154a7098f78b5e.png69be331c02cca6a805154a7098f78b5e.png69be331c02cca6a805154a7098f78b5e.png,顺手给小编加个鸡腿,万分感谢~~~

END

— — — — — — — — — — — — —

 1fe559a994381d75e3417991039aa486.png

更多信息,扫码关注我们哦!

f58afb3365f436463ed7ca211a4acd4d.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值