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

点击上方蓝色关注我们!

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


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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程安全问题解决

方式一(同步代码块) synchronized(同步监视器){ //需要被同步的代码 } 说明:1.操作共享数据的代码,即为需要被同步的代码。 -->不能包含代码多了,也不能包含代码少了。 2.共享数据:多个线程共同操作的变量。比如:…

Chrome DevTools 调研笔记

1 说明 此篇文章针对Chrome DevTools常用功能进行调研分析。描述了每个功能点能实现的功能、应用场景和详细操作。 2 Elements 2.1 功能 检查和实时更新页面的HTML与CSS 在 Elements 面板中检查和实时编辑 DOM 树中的任何元素。在 Styles 窗格中查看和更改应用到任何选…

java中你知道的这四种代码块吗?

点击上方蓝字关注我们大家好,我是雄雄,今天给大家分享的是:java中的四种代码块什么叫代码块?代码块就是将多行代码封装到一个“{}”中,形成一个独立的代码区,这就构成了代码块,一般常见的代码块…

DDD理论学习系列(5)-- 统一建模语言

1.引言 上一节讲解了领域模型,领域模型主要是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的关系。然后将这些实体和实体之间的关系以某种形式(比如UML、图…

java中你知道这四种代码块吗?

大家好,我是雄雄,今天给大家分享的是:java中构造代码块的用法。 什么叫代码块?代码块将多行代码封装到一个{}中,形成一个独立的代码区,这就够成了代码块,一般常见的代码块是这样的: …

jzoj2152-终极数【堆】

题目(复杂) 给定一个长度为n的序列a,试求出对于序列a的每一个前缀的终极数x,使得 最小,试求出终极数t(如若有多个终极数t,只需输出最小的那个) 正解 其实就是求中位数… 输入 …

谈谈准确率(P值)、召回率(R值)及F值

转载自 谈谈准确率(P值)、召回率(R值)及F值 谈谈准确率(P值)、召回率(R值)及F值 一直总是听说过这几个词,但是很容易记混,在这里记录一下。希望对大家理解…

线程创建两种方式

方式一(继承于Thread类) 创建一个继承于Thread类的子类重写Thread类的run() --> 将此线程执行的操作声明在run()中创建Thread类的子类的对象通过此对象调用start() package com.wdl.java;//1. 创建一个继承于Thread类的子类 class MyThread extends Thread {//2. 重写Thre…

在ASP.NET CORE 2.0使用SignalR技术

一、前言 上次讲SignalR还是在《在ASP.NET Core下使用SignalR技术》文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划中。时间过得很快,MS已经发布了.NET Core 2.0 Preview 2 预览版,距离正式版已经不远了&#xf…

java中常见的几种内部类,你会几个?(未完)

点击上方蓝色关注我们!大家好,我是雄雄,今天给大家介绍的是java中的几种内部类。java中常见的几个内部类,你会几个?我会四个!在看每个新知识点时,我们不禁有这样或者那样的疑问,比如…

通俗理解信息熵

转载自 通俗理解信息熵 通俗理解信息熵 前段时间德川和我讲解了决策树的相关知识,里面德川说了一下熵,今天整理了一下,记录下来希望对大家理解有帮助~ 1、信息熵的公式 先抛出信息熵公式如下: 其中代表随机事件X为的概率&…

.NET Core 2.0 Preview 2为开发人员带来改进

Microsoft发布了.NET Core 2第二个预览版(Preview 2),该版本可用于Mac OS X、Linux和Windows平台。Preview 2首次给出了对所有平台上各种软件包和安装程序的统一命名模式。所有的运行时文件将以"dotnet-运行时名称”命名,而S…

java中,剩下的这两个内部类不太好理解!

点击上方蓝色关注我们!大家好,我是雄雄,今天我们接着昨天的分享,将剩余的两个内部类(方法内部类和匿名内部类)结束掉,这两个内部类都不太好理解。昨天的推文:java中常见的几种内部类…

【jzoj】2018.2.3NOIP普及组——D组模拟赛

前言 万年D组系列… 正题 题目1:数池塘(jzoj1898) 有一个地方有一些积水,连着的积水是一个池塘,求池塘数。 输入 第1行:由空格隔开的两个整数:N和M 第2..N1行:每行M个字符代表…

通俗理解条件熵

转载自 通俗理解条件熵 通俗理解条件熵 前面我们总结了信息熵的概念通俗理解信息熵,这次我们来理解一下条件熵。 1、信息熵以及引出条件熵 我们首先知道信息熵是考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望。公式如下: 我…

WebAssembly:随风潜入夜

What? WebAssembly 是一种二进制格式的类汇编代码,可以被浏览器加载和并进一步编译成可执行的机器码,从而在客户端运行。它还可以作为高级语言的编译目标,理论上任何语言都可以编译为 WebAssembly。 我们知道汇编语言就是机器码的…

让java的多重继承成为现实!

点击上方蓝色关注我们!大家好,我是雄雄,前两天给大家说了说java中的四种内部类,推文分别为:静态内部类和成员内部类方法内部类和匿名内部类在内部类的基础上,我们来看看今天的知识点儿。众所周知&#xff0…

通俗理解决策树算法中信息增益的

转载自 通俗理解决策树算法中信息增益的 通俗理解决策树算法中的信息增益 在决策树算法的学习过程中,信息增益是特征选择的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,说明该特征越重要&#x…

DDD理论学习系列(6)-- 实体

1.引言 实体对应的英语单词为Entity。提到实体,你可能立马就想到了代码中定义的实体类。在使用一些ORM框架时,比如Entity Framework,实体作为直接反映数据库表结构的对象,就更尤为重要。特别是当我们使用EF Code First时&#xf…

班级日常 | 一天一瞬间!

点击上方蓝色关注我们!欢迎来到今天的“一天一瞬间”专栏在学习word操作时,同学们的兴趣还是较高的,但是,比起“一天一个黑科技”来说,还是差了许多!前面两天都是学的一些简单的DOS命令,比如进某…