关于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变量的赋值在声明之前,但实际上执行的时候会先执行变量的声明,再按代码顺序执行变量值的赋值动作,然后再进行构造函数对实例的初始化构造。
这三种实例变量的初始化语句经过编译器处理后,都会合并到构造器中去,其中定义变量语句转换得到的赋值语句、初始化块中的语句转化得到的赋值语句,总是位于构造器的所有语句之前。合并后两种赋值语句的顺序保持他们在源码中的顺序。
 
 
 
 
posted @ 2016-04-25 20:13  wangb021  阅读(3886)  评论(0编辑  收藏  举报