Java 常见问题思考
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 常见问题思考的更多相关文章
- java 泛型思考
java泛型并没有像C++那样原生支持,因此,为了保证迁移兼容性,编译器在编译时会擦除具体类型,因此不能通过泛型调用具体方法. 如果调用必须用extends关键字限定范围,也正是由于这个原因,java ...
- 转自52 梦回凉亭的她 Java常见问题,面试题
收集整理分享# 相关概念## 面向对象的三个特征封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.## 多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不 ...
- java课后思考问题(二)
1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. import java.math.BigInteger; public class Suijishu public stati ...
- java课后思考问题(一)
1.一个Java类文件中真的只能有一个共有类吗? 一个Java类文件中只能有一个公有类 2.请使用Eclipse或javac检测一下以下代码,有错吗? 在Java中,可以将一个类定义在另一个类里面或者 ...
- Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...
- java课后思考问题(八)
1.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. (1)import javax.swing.*; class AboutEx ...
- java课后思考问题(七)
1.继承条件下的构造方法调用 package parent;class Grandparent { public Grandparent() { System.out.println("Gr ...
- java常见问题集锦
Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案 Eclipse ...
- Java并发思考
如果说传统金融政企软件主要看事务,而互联网软件主要是并发,就像淘宝双十一主要就是在解决并发问题. 并发的目的是提高系统效率,响应时间和吞吐量. Java中并发的基本单位是线程,如何更好的解决线程协作通 ...
随机推荐
- 区间dp总结
poj 1141 Brackets Sequence 基础的区间dp题,注意dp边缘的初始化,以及递归过程中的边界 poj 2955 Brackets 依旧注意初始化,水题 hdu 4745 Two ...
- HDU 4345 Permutation dp
Permutation Problem Description There is an arrangement of N numbers and a permutation relation that ...
- Notification通知
manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); button = (Button) fi ...
- 垂直的SeekBar:VerticalSeekBar
public class VerticalSeekBar extends AbsSeekBar { private Drawable mThumb; public interface OnSeekBa ...
- Eclipse 导入 Hadoop 源码
1.准备工作 jdk: eclipse: Maven: libprotoc :https://developers.google.com/protocol-buffers/ hadoop:http:/ ...
- Xamarin Android设置界面提示类型错误
Xamarin Android设置界面提示类型错误 错误信息:Integer types not allow (at ‘padding’ with value ’10’)Android界面属性的长度和 ...
- SPOJ962 Intergalactic Map(最大流)
题目问一张无向图能否从1点走到2点再走到3点,且一个点只走一次. 思维定势思维定势..建图关键在于,源点向2点连边,1点和3点向汇点连边! 另外,题目数据听说有点问题,出现点大于n的数据.. #inc ...
- BZOJ4298 : [ONTAK2015]Bajtocja
设f[i][j]为第i张图中j点所在连通块的编号,加边时可以通过启发式合并在$O(dn\log n)$的时间内维护出来. 对于每个点,设h[i]为f[j][i]的hash值,若两个点hash值相等,则 ...
- 添加 Windows 8.1 无虚拟机启动项 解决极品飞车的不支持虚拟机报错
在Windows 8.1 64位环境下,安装完极品飞车17后,运行程序会出现错误对话框: Sorry, this application cannot run under a Virual Machi ...
- java中的sleep()和wait()的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...