切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道

点击上方蓝色关注我们!

先来看看什么是构造函数(方法):是一种特殊的方法,特殊之处就在于它没有返回类型,void也不可以有。且方法名与类名完全相同。主要是用来创建对象时初始化对象,也就是为对象成员变量赋初始值。

其特点如下:

  1. 方法名与类型完全相同

  2. 构造方法没有返回值,void也不可以。

  3. 构造方法不能被直接调用,必须通过new运算符在创建对象时才会自动调用

  4. 在java中,当创建一个类时,通常程序会默认创建一个无参的构造方法,即public 类名(){}。但是该类中有带参的构造方法时,程序员必须手动创建一个无参的构造方法。

至此,相信大家对构造方法有个初步的了解。今天要讲的是:避免在构造函数中初始化其他类,言外之意就是构造方法你别整的太复杂了,出了会大大影响类的初始化效率之外,还会出现意向不到的效果,如下:

宠物类(父类)

/**
 *
*
* 项目名称:BianChengXiGuan
* 类名称:Pet
* 类描述:父类,宠物类
* 创建人:Mu Xiongxiong
* 创建时间:2020-8-15 下午1:25:11
* 修改人:Mu Xiongxiong
* 修改时间:2020-8-15 下午1:25:11
* 修改备注:
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version
*
 */
public class Pet {
  
  /**
   *
       * 构造函数
       * @discription
       * @author Mu Xiongxiong
       * @created 2020-8-15 下午1:33:28
     * 个人博客:https://blog.csdn.net/qq_34137397
     * 微信公众号:雄雄的小课堂
   */
  public Pet(){
    new People();
  }
  

}

小狗类(子类)

package org.test;

/**
 *
*
* 项目名称:BianChengXiGuan
* 类名称:Dog
* 类描述:子类,小狗类
* 创建人:Mu Xiongxiong
* 创建时间:2020-8-15 下午1:25:32
* 修改人:Mu Xiongxiong
* 修改时间:2020-8-15 下午1:25:32
* 修改备注:
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version    
*
 */
public class Dog extends Pet {
  
  /**
   *
  * @Description: 该方法的主要作用:吃
  * @Title: eat
  * @param   设定文件
  * @return  返回类型:void
  * @throws
  * 个人博客:https://blog.csdn.net/qq_34137397
  * 微信公众号:雄雄的小课堂
   */
  public void eat(){
    System.out.println("小狗在吃饭");
  }
}

其他类(人类)

package org.test;
/**
 *
*
* 项目名称:BianChengXiGuan
* 类名称:People
* 类描述:人类,其他的类
* 创建人:Mu Xiongxiong
* 创建时间:2020-8-15 下午1:27:09
* 修改人:Mu Xiongxiong
* 修改时间:2020-8-15 下午1:27:09
* 修改备注:
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version
*
 */
public class People {

  /**
   *
       * 构造函数
       * @discription
       * @author Mu Xiongxiong
       * @created 2020-8-15 下午1:33:11
     * 个人博客:https://blog.csdn.net/qq_34137397
     * 微信公众号:雄雄的小课堂
   */
  public People(){
    new Dog();
  }
  
}

测试类(TestMain)

package org.test;

public class TestMain {
  
  public static void main(String[] args) {
    Dog d = new Dog();
    d.eat();
  }

}

这几个类的业务其实不难,大致的浏览一遍之后,你会发现,在Pet类的构造方法中初识化了People类,在People类的构造方法中初识化了Dog类,最后在测试类中调用Dog类的eat方法,你觉得代码的运行结果是什么呢?是“小狗在吃饭?”

运行结果如下:

显而易见,无法运行,并且报java.lang.StackOverflowError错误(栈内存),分析一下为什么报此错。

我们先从main入手查看,首先初始化了Dog类,那么程序必然会调用Dog的无参构造方法(系统默认创建了),此时,JVM会默认调用其父类Pet的构造方法,那么继续看,Pet的构造方法又调用了初识话了People类,那么就会调用People类的无参构造方法:

然后在继续调用Dog类的无参构造方法,JVM在调用父类的无参构造方法,在初始化People类,再调用Dog构造方法……一直在循环,就造成了死循环,这个异常固然就出来了。

所以,切记,不要在构造方法里面初始化其他类,别不以为然,当你的项目大了的时候,你不可能像看这个小案例似的,一眼欲穿。

参考文章:《编写高质量的代码:改善java程序的151个建议》

作者:秦小波

支持作者

赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!

往期精彩

常用插件免费下载(一),未完连载中……


接口中可以写实现代码吗?可以,但是……一般不要写!


最全、最详细的配置jdk十步法!


新机必装!那些你不知道的实用技软件在这里!文末免费获取



原文地址:https://www.cnblogs.com/a1111/p/14877429.html