Java-Java中的成员变量赋初值时机问题
Java类的成员变量,在声明的时候直接赋值与在构造函数中再赋值,这个是无所谓的,还是有什么最佳实践?
如:
class A{
private int a=3;
....
}
或
class A{
private int a;
public A(){
a=3;
}
....
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如果只有一个构造函数, 那么问题不大, 但是有很多时候 类不止有一个构造函数的, 如果直接初始化值的话会每次构造的时候都要初始化一遍, 在构造函数中改了 又得赋值一遍哈, 所以如果确定只有一个构造函数就可以初始化, 否则就在构造函数中赋值吧, 建议复杂一点的初始化也放在构造函数中
一般来说,最好是在构造函数里面赋初值。原因如下:
1.如果你直接在变量声明的时候赋初值,而不在构造函数中初始化,那么该类的所有对象对于这个成员变量的值都是一样的,这样不符合面向对象的性质。如果确实所有的对象对于这个成员变量都是一样的话,就声明为static类型的吧。
2.如果你不仅在变量声明的时候赋初值,还在构造函数中初始化,那么你在声明的时候的初始化纯属多余了。而且这样代码也不容易维护,声明时的初始化会给维护代码的人员一种错觉,认为这个变量可能就是这个值了,但是实际上你又在构造函数中初始化了一遍,这样不提倡。
综上:除非是static成员变量,否则为了保持面向对象的性质和程序的易读性,不要在声明成员变量的时候初始化。
推荐的成员变量初始化方式:
1.对于static静态成员变量,声明的时候初始化。
2.对于不同对象初始值不同的非static成员变量,通过构造函数传参进行初始化。
3.对于不同对象初始值相同的非static成员变量,单独写一个init()函数,在这个函数里面对这些成员变量进行统一初始化,然后在构造函数的最后调用这个init()函数。
这得分情况了,如果成员变量的值需要其他结果或者方法返回值给它传递值的话,在声明时就不用赋值,如果一开始就需要个值的话,就在初始化时赋值。
问题里, 对jvm来说, 在哪里赋值都是一样的. 最终都是在初始化函数里赋值. 上字节码:
字节码完全没有区别:
在构造函数中赋值是一种好习惯!其实变量在声明的时候就可以初始化,也就是赋一个初值,但是在定义的时候赋值针对的是类,如果特定的对象需要赋特定的值得话赋值语句就只能写到方法里面去,这显然有点不合适!所以在构造函数里进行全局变量的初始化,而且构造函数最好能够接受传入参数如果需要的话。
在声明的时候直接 private int a=3; 是初始化,即使这里没有自己初始化,系统也会自动给它一个初始值。
而在构造函数中 a=3; 是赋值,在执行这条语句之前已经有过一次初始化了,就是在声明a的地方。
所以如果只是想要初始化成员,那么最好在声明的时候就初始化,而不需要在构造函数中。
1.在初始变量的时候赋值,那么这个赋值会被写入编译后文件的ESD段里面去,占用了程序的空间,一个变量的话可能无所谓,但是如果是一个很大的对象,而且这个对象又嵌套了很多数据呢,如果单个程序的话可能也无所谓,但是如果涉及到的是一个庞大的系统,这个类会被用到N次,那么就有所谓了,所以这要看具体情况。
2.从代码可读性和安全的角度来说,如果必须用到这个变量且不能为空,那么最好直接赋一个默认初始值,如果不赋值,要确保你有相关的说明让别人知道使用这个类必须给这个变量赋值,又异或,你可以保证如果这个变量为空的时候程序可以捕获抛出这个异常,保证程序安全和良好的可读性