java中变量初始化详解

本文深入探讨了Java中成员变量与构造函数的初始化机制,包括类变量(类静态成员)、成员变量(类成员)及方法中变量的生命周期与初始化流程。详细解释了在涉及继承与静态作用域时的初始化顺序,并强调了Java编译器确保域在使用前被初始化的原则。
摘要由CSDN通过智能技术生成

类变量(类静态成员):类被加载时产生;它的生存期是类的生存期;自动初始化(类被加载)
成员变量(类成员): 在使用new创建该类实例时产生;它的生存期与该类实例对象的生存期相同;

方法中的变量,不会被自动初始化。比如main方法中的变量index,定义如int index; 它不会被自动初始化。

 

java编译器确保域(成员变量或块)在被使用之前必需初始化,即使你没直接初始化,它也会默认给你一个值。 

1.  如果不涉及继承跟static,用new创建对象时,会调用那个类的构造函数,而在调用构造函数之前必需先初始化域(因为在构造函数里,可能会用到这些成员变量) 
等域初始化完后再调用构造函数。强调一点:只要是成员变量,那么不管它放在类的哪个部位(但在方法或块内部不算,因为那算是局部变量),它都在构造函数调用之前调用,这是编译器确保的。 

2.  如果涉及继承,当用new创建子类对象时,调用顺序是这样的: 
   1.先初始化父类的域(成员变量或块) 
   2.调用父类的构造函数(没有明确定义的话,调用默认那个,即编译器为你创建的) 
   3.再到子类,初始化子类的域 
   4.这时才轮到调用子类的构造函数 
原则是:要确保域在被调用之前要被初始化. 
上面是涉及两层,如果是涉及多层继承的,那么一致递推上去,即先初始化父类的域,然后调用父类构造函数,再初始化子类的域然后再调用子类的构造函数,再初始化子子类的域(用这个名字好像有点怪,哈哈,就是孙子类的意思)然后再调用子子类的构造函数,一致类推下去 

3.涉及static的话,static域是在编译的时候加载的,原则是: 
   1.static域是在非static(上面说的都是非static)之前调用的 
   2.static域只初始化一次(即只调用一次),打个比方A a = new A(); A 里有static域,只有当你第一次使用new创建对象的时候它会在非static之前调用,而如果你还想再用new创建对象时,static域这段代码是不会被调用的(因为static的东西是属于类,所以对象共享的,一次就够了) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值