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

举报
穆雄雄 发表于 2022/12/13 21:56:03 2022/12/13
2.1k+ 0 0
【摘要】 先来看看什么是构造函数(方法):是一种特殊的方法,特殊之处就在于它没有返回类型,void也不可以有。且方法名与类名完全相同。主要是用来创建对象时初始化对象,也就是为对象成员变量赋初始值。其特点如下:方法名与类型完全相同构造方法没有返回值,void也不可以。构造方法不能被直接调用,必须通过new运算符在创建对象时才会自动调用在java中,当创建一个类时,通常程序会默认创建一个无参的构造方法,即...

先来看看什么是构造函数(方法):是一种特殊的方法,特殊之处就在于它没有返回类型,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个建议》

作者:秦小波

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。