切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道
点击上方蓝色关注我们!
先来看看什么是构造函数(方法):是一种特殊的方法,特殊之处就在于它没有返回类型,void也不可以有。且方法名与类名完全相同。主要是用来创建对象时初始化对象,也就是为对象成员变量赋初始值。
其特点如下:
方法名与类型完全相同
构造方法没有返回值,void也不可以。
构造方法不能被直接调用,必须通过new运算符在创建对象时才会自动调用
在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个建议》
作者:秦小波
支持作者
赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!
往期精彩