昆明java培训
达内昆明广州春城路

18487146383

热门课程

避免在构造函数中初始化其它类

  • 时间:2016-09-30
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训的老师发现,构造函数是一个类初始化必须执行的代码,它决定着类初始化的效率,如果构造函数比较复杂,而且还关联了其它类,则可能产生想不到的问题,我们来看如下代码:

1 public class Client35 {

2    public static void main(String[] args) {

3        Son son = new Son();

4        son.doSomething();

5    }

6 }

7

8 //父类

9 class Father {

10    public Father() {

11        new Other();

12    }

13 }

14

15 //相关类

16 class Other {

17    public Other() {

18        new Son();

19    }

20 }

21

22 //子类

23 class Son extends Father {

24    public void doSomething() {

25        System.out.println("Hi, show me Something!");

26    }

27 }

这段代码并不复杂,只是在构造函数中初始化了其它类,想想看这段代码的运行结果是什么?会打印出"Hi,show me Something!"吗?

答案是这段代码不能运行,报StatckOverflowError异常,栈(Stack)内存溢出,这是因为声明变量son时,调用了Son的无参构造函数,JVM又默认调用了父类的构造函数,接着Father又初始化了Other类,而Other类又调用了Son类,于是一个死循环就诞生了,知道内存被消耗完停止。

大家可能觉得这样的场景不会出现在开发中,我们来思考这样的场景,Father是由框架提供的,Son类是我们自己编写的扩展代码,而Other类则是框架要求的拦截类(Interceptor类或者Handle类或者Hook方法),再来看看问题,这种场景不可能出现吗?

可能大家会觉得这样的场景不会出现,这种问题只要系统一运行就会发现,不可能对项目产生影响。

那是因为我们这里展示的代码比较简单,很容易一眼洞穿,一个项目中的构造函数可不止一两个,类之间的关系也不会这么简单,要想瞥一眼就能明白是否有缺陷这对所有人员来说都是不可能完成的任务,解决此类问题最好的办法就是:不要在构造函数中声明初始化其他类,养成良好习惯。

了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

上一篇:构造函数尽量简化
下一篇:使用构造代码块精简程序

“因材施教,分级培优”十问十答

达内举办“2016授课讲师资格认证培训“,不断提升教学品质

达内牵手猿圈科技,打造技能测评、学习、就业一站式服务

毕业三年之内能转行学编程吗?

选择城市和中心
贵州省

广西省

海南省

台湾