java对象初始化过程

17 篇文章 0 订阅

假设有一下类:

class Test{
    int i;
    int j = 0;
    
    int count(){ return 0 };
    Test() {}

    int n =0;


}

我们知道,任何对象在使用前都会被初始化,方法里面的局部变量必须给初始化值才能通过编译。

现在我们来讨论一下初始化的过程:

对于字段(变量)而言,如果是基本类型,那么即使不给初始值,都会得到jvm默认的初始值:boolean默认是false,byte、short、int、long是0,double和float是0.0,char为/u0000(很早的jvm赋值为0),如果是对象,比如 Test test;打印test则出现null,这样子就不难理解为什么我们用system.out打印对象的时候,会得到对象的地址。 

在类的内部,变量定义的顺序决定了初始化的顺序:int i定义在int j前,i先得到初始化值。

所有变量都会在方法、包括构造方法被调用前得到初始化

在我上一篇关于static的博客里面说道static关键字的特性,在这里说说静态数据的初始化:

无论创建多少个对象,静态数据都只占有一份存储区域(静态变量和方法属于类),static不能用于局部变量。

对于对象的初始化,也先是静态对象在前,

那么这里可能就有一个疑问:静态方法和普通变量,谁先是被初始化呢?答案其实我意见说了,还是变量先初始化。

事实上,构造方法也是静态方法,只是没有写明static而已,所有的变量都会在构造器(静态方法之前执行)。

在一些类里,会有静态代码块,即static{  },静态代码块会有限执行(同为静态代码块按顺序执行),和静态初始化动作一样,只执行一次。

本文内容参考了第四版《Java编程思想》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值