课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 避免在构造函数中初始化其它类
  • 避免在构造函数中初始化其它类

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

  • 昆明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)!

    推荐文章

上一篇:构造函数尽量简化

下一篇:使用构造代码块精简程序

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56