zoukankan      html  css  js  c++  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个建议》

    作者:秦小波

    支持作者

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

    往期精彩

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


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


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


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



  • 相关阅读:
    springmvc入门详解
    getClass 与getSimpleName
    mybati的存储过程
    mybatis与spring的整合
    mybatis分页插件以及懒加载
    mybatis知识总结
    【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
    【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
    【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    【Java面试题】27 多线程笔试面试概念问答
  • 原文地址:https://www.cnblogs.com/a1111/p/14877429.html
Copyright © 2011-2022 走看看