成员变量的声明时初始化和构造方法中初始化的区别是什么? 什么情况下用什么方式?比如public class UserServiceImpl implements UserService { private UserDao userDao;
public UserServiceImpl() { this.userDao = new UserDao(); } 为什么不直接写 private UserDao userDao = new UserDao() 取代构造函数?又比如public class TestServlet extends HttpServlet { private UserService userService;
public TestServlet() { this.userService = new UserServiceImpl(); }
} 为什么不直接写 private UserService userService = new UserService() 取代构造函数?
在构造函数中初始化。具有前瞻性。很好的考虑了项目未来的优化,维护。 例如: 这个类里面有一个属性String name ;代表了公司的名称。 如果你直接初始化 String name = "XXX公司"; 那么如果以后公司换了名称,但是开发者离公司很远。 那么你势必要跑很远去那个公司重新安装。 而且你也要重新修改代码,重新编译。如果是用构造函数初始化,这个公司的名称保存在一个文本文档里面。 那么你只需要让那个公司在对应的文本文档里面把名字修改了即可。这个只是一个最简单的例子而已。还有很多原因。总的说呢。你代码写少了。做多了,你自然就知道什么时候该用什么时候不该用了。
初始化块优先于构造方法被执行,如果初始化块执行中,构造方法被调用之前没有什么特殊的处理,只是单纯的成员变量赋值,那么效果是一样的如 public class A { int a; //方法1 先定义 //int a = 5; //方法2 定义时直接赋值 {System.out.println(a);} //如果有这样的处理 public A() { a = 5; //方法1 然后在构造方法赋值 } public static void main(String[] args) { new A(); } }
声明时为成员变量赋值,那么你一创建对象,这个赋值就进行,而且先于构造器执行。 而且你每次创建这个类的对象,都是同一个值,比如你声明的时候写private int age = 18;,那么你每一个对象的age的值都是被初始成18.但是如果你把赋值语句写在构造器,比如: constructor(int a){ age = a; }那么你每次创建对象都可以单独为每一个对象赋值不同的age。比如你创建10个学生对象,他们的年龄不一定都是18啊,所以最好不要用声明时就赋值,最好写进构造器,为每一个对象赋不同的年龄。
{
private UserDao userDao;
public UserServiceImpl()
{
this.userDao = new UserDao();
}
为什么不直接写 private UserDao userDao = new UserDao() 取代构造函数?又比如public class TestServlet extends HttpServlet
{
private UserService userService;
public TestServlet()
{
this.userService = new UserServiceImpl();
}
}
为什么不直接写 private UserService userService = new UserService() 取代构造函数?
例如:
这个类里面有一个属性String name ;代表了公司的名称。
如果你直接初始化 String name = "XXX公司";
那么如果以后公司换了名称,但是开发者离公司很远。
那么你势必要跑很远去那个公司重新安装。
而且你也要重新修改代码,重新编译。如果是用构造函数初始化,这个公司的名称保存在一个文本文档里面。
那么你只需要让那个公司在对应的文本文档里面把名字修改了即可。这个只是一个最简单的例子而已。还有很多原因。总的说呢。你代码写少了。做多了,你自然就知道什么时候该用什么时候不该用了。
public class A {
int a; //方法1 先定义
//int a = 5; //方法2 定义时直接赋值
{System.out.println(a);} //如果有这样的处理 public A() {
a = 5; //方法1 然后在构造方法赋值
}
public static void main(String[] args) {
new A();
}
}
声明时为成员变量赋值,那么你一创建对象,这个赋值就进行,而且先于构造器执行。
而且你每次创建这个类的对象,都是同一个值,比如你声明的时候写private int age = 18;,那么你每一个对象的age的值都是被初始成18.但是如果你把赋值语句写在构造器,比如:
constructor(int a){
age = a;
}那么你每次创建对象都可以单独为每一个对象赋值不同的age。比如你创建10个学生对象,他们的年龄不一定都是18啊,所以最好不要用声明时就赋值,最好写进构造器,为每一个对象赋不同的年龄。