关于Java的构造器和直接为成员变量赋值的区别


 
首先,看一下为什么要用构造器?
1、Java类的 成员变量在被修饰为public、protected和包 访问权限时,可以在不同层次上直接给 成员变量赋值。
但是,赋值的前提是:必须存在持有成员变量的对象。而对象的初始化必须调用构造函数,所以构造函数是必不可缺的。
至于使用 构造函数还是直接声明时给成员变量赋值,那就要看情况而定。
如果创建的这个对象是不可变的,那么就必须使用构造函数初始化成员变量,反之,就无所谓。
另外,直接给成员变量赋值,Java是不推荐的,因为这样会破坏它的封装性。所以,建议在构造函数或提供setters方法对变量赋值。
2、成员变量的赋值一般通过构造函数;直接赋值一般的话都是一些常成员变量,final关键字开头的。
3、其他的时候基本上都是用构造函数构造函数试用于动态创建对象。基于对象编程的思想,是不赞成直接给类里面的变量直接赋值的。
 
 
作者:小开
链接:http://www.zhihu.com/question/20616186/answer/15646132
来源:知乎

类变量、实例变量的初始化比较相似,对于实例变量有一个例子
public class RAMTest {
{
price = 3.4;//①--非静态语句块
}
public RAMTest( double price) {
this.price = price;//②-- 构造函数
}
double price = 2.0;//③-- 声明语句并赋值
}


本例中对实例变量price的初始化有三处
执行顺序为:③中price变量声明[price=0.0]
--①中price变量赋值[price=3.4]
--③中price变量赋值[price=2.0]
--②中price构造函数赋值
需要注意的是,虽然非静态语句初始块中的price变量的赋值在声明之前,但实际上执行的时候会先执行变量的声明,再按代码顺序执行变量值的赋值动作,然后再进行构造函数对实例的初始化构造。
这三种实例变量的初始化语句经过编译器处理后,都会合并到构造器中去,其中定义变量语句转换得到的赋值语句、初始化块中的语句转化得到的赋值语句, 总是位于构造器的所有语句之前。合并后两种赋值语句的顺序保持他们在源码中的顺序。
 
 
 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM