Java中的成员变量是选择在声明时赋值还是在构造函数中赋值?

 // 通过构造函数赋值
 public class UserRequestImpl extends ModuleImplBase {

     private UserRequestBean bean; 

     public UserRequestImpl(WebDriver driver) {
         super(driver);
         bean = new AttestationUserRequestBean();
     }
 }

 // 在声明成员变量时即赋值
 public class UserRequestImpl extends ModuleImplBase {

     private UserRequestBean bean = new UserRequestBean(); 

     public UserRequestImpl(WebDriver driver) {
         super(driver);
     }
 }

在多态情况下,这2种赋值方法尤其需要注意。比如类Demo有个Map类型成员变量,如果直接赋值,那么就必须要指定这个Map是何种Map,而通过构造函数赋值,这个就不确定了,有可能是各种Map的实现。所以,通过构造函数与set方法赋值,能够使程序更加的灵活,也能够体现多态的面向对象的特征。
那么什么情况下直接赋值比较好呢?我建议一些不会变化(比如常量 )或者明确指定实现的依赖,比如记录日志的Log,这种一般我建议写成final以及static的,搞Web多线程的,能节约点内存就节约点内存,不是怕内存不够,现在服务器内存都几十G了,内存很便宜了,真正是为了节约JVM在GC上消耗的时间。

总之:

  • 通过构造函数或者set方法注值,使得程序更加灵活,不要把变量和方法写成静态的 这样有利于通过继承扩展原有对象,实现多态,而写成静态的就不行了 就没法实现多太了。
  • 直接赋值,在某种情况下能够节约内存开销。
  • 构造函数中对私有变量赋值的好处是在定义对象时会初始化,是否加一个独立的setter函数就要考虑程序在会不会在其他地方允许改变私有变量的值。
  • 另外如果在成员变量声明的时候和构造函数中都有赋值操作 会按照先执行成员变量声明时的赋值然后调用构造函数赋值。 所以最终以构造函数为准。

Java 常见问题思考的更多相关文章

  1. java 泛型思考

    java泛型并没有像C++那样原生支持,因此,为了保证迁移兼容性,编译器在编译时会擦除具体类型,因此不能通过泛型调用具体方法. 如果调用必须用extends关键字限定范围,也正是由于这个原因,java ...

  2. 转自52 梦回凉亭的她 Java常见问题,面试题

    收集整理分享# 相关概念## 面向对象的三个特征封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.## 多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不 ...

  3. java课后思考问题(二)

    1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. import java.math.BigInteger; public class Suijishu public stati ...

  4. java课后思考问题(一)

    1.一个Java类文件中真的只能有一个共有类吗? 一个Java类文件中只能有一个公有类 2.请使用Eclipse或javac检测一下以下代码,有错吗? 在Java中,可以将一个类定义在另一个类里面或者 ...

  5. Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...

  6. java课后思考问题(八)

    1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. (1)import javax.swing.*; class AboutEx ...

  7. java课后思考问题(七)

    1.继承条件下的构造方法调用 package parent;class Grandparent { public Grandparent() { System.out.println("Gr ...

  8. java常见问题集锦

    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案 Eclipse ...

  9. Java并发思考

    如果说传统金融政企软件主要看事务,而互联网软件主要是并发,就像淘宝双十一主要就是在解决并发问题. 并发的目的是提高系统效率,响应时间和吞吐量. Java中并发的基本单位是线程,如何更好的解决线程协作通 ...

随机推荐

  1. js 完全分离 window.onload=

    js 完全分离  window.onload= <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

  2. PHP生成不重复随机数的方法

    无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下. 方法一: ...

  3. CI框架分页类代码

    model层  ;     $page = $);     ;      }else{         $start = $page;       }     $data['results'] = $ ...

  4. 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

    今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...

  5. Java线程面试题 Top 50

    转自:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java ...

  6. loj 1017(dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25843 思路:我们可以发现题目与点的X坐标没有关系,于是可以直接对 ...

  7. 网站构建学习笔记(0)——基本概念了解及资源学习(copy自w3school)

    一.学习方面 1.WWW - 万维网 什么是 WWW? WWW 指万维网(World Wide Web) 万维网常被称为Web Web 是由遍布全球的计算机所组成的网络 所有 Web 中的计算机都可以 ...

  8. AppInventor学习笔记(五)——瓢虫快跑应用学习

    一.瓢虫引入 1:加入控件: 先引入方框中含有的控件,里面有两个画布,一个图像精灵,一个重力感应,一个时钟(设为10Ms).顺手改名.设置图像精灵的移动speed为10,并且引入瓢虫的图像 2.加入逻 ...

  9. 【HTML5】地理定位

    <!DOCTYPE html> <html> <body> <p id="demo">点击这个按钮,获得您的坐标:</p> ...

  10. CodeForces 300C --数论

    A - A Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Statu ...