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. 区间dp总结

    poj 1141 Brackets Sequence 基础的区间dp题,注意dp边缘的初始化,以及递归过程中的边界 poj 2955 Brackets 依旧注意初始化,水题 hdu 4745 Two ...

  2. HDU 4345 Permutation dp

    Permutation Problem Description There is an arrangement of N numbers and a permutation relation that ...

  3. Notification通知

    manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); button = (Button) fi ...

  4. 垂直的SeekBar:VerticalSeekBar

    public class VerticalSeekBar extends AbsSeekBar { private Drawable mThumb; public interface OnSeekBa ...

  5. Eclipse 导入 Hadoop 源码

    1.准备工作 jdk: eclipse: Maven: libprotoc :https://developers.google.com/protocol-buffers/ hadoop:http:/ ...

  6. Xamarin Android设置界面提示类型错误

    Xamarin Android设置界面提示类型错误 错误信息:Integer types not allow (at ‘padding’ with value ’10’)Android界面属性的长度和 ...

  7. SPOJ962 Intergalactic Map(最大流)

    题目问一张无向图能否从1点走到2点再走到3点,且一个点只走一次. 思维定势思维定势..建图关键在于,源点向2点连边,1点和3点向汇点连边! 另外,题目数据听说有点问题,出现点大于n的数据.. #inc ...

  8. BZOJ4298 : [ONTAK2015]Bajtocja

    设f[i][j]为第i张图中j点所在连通块的编号,加边时可以通过启发式合并在$O(dn\log n)$的时间内维护出来. 对于每个点,设h[i]为f[j][i]的hash值,若两个点hash值相等,则 ...

  9. 添加 Windows 8.1 无虚拟机启动项 解决极品飞车的不支持虚拟机报错

    在Windows 8.1 64位环境下,安装完极品飞车17后,运行程序会出现错误对话框: Sorry, this application cannot run under a Virual Machi ...

  10. java中的sleep()和wait()的区别

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...