切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道
點擊上方藍色關注我們!
先來看看什么是構造函數(shù)(方法):是一種特殊的方法,特殊之處就在于它沒有返回類型,void也不可以有。且方法名與類名完全相同。主要是用來創(chuàng)建對象時初始化對象,也就是為對象成員變量賦初始值。
其特點如下:
方法名與類型完全相同
構造方法沒有返回值,void也不可以。
構造方法不能被直接調(diào)用,必須通過new運算符在創(chuàng)建對象時才會自動調(diào)用
在java中,當創(chuàng)建一個類時,通常程序會默認創(chuàng)建一個無參的構造方法,即public 類名(){}。但是該類中有帶參的構造方法時,程序員必須手動創(chuàng)建一個無參的構造方法。
至此,相信大家對構造方法有個初步的了解。今天要講的是:避免在構造函數(shù)中初始化其他類,言外之意就是構造方法你別整的太復雜了,出了會大大影響類的初始化效率之外,還會出現(xiàn)意向不到的效果,如下:
寵物類(父類)
/*** * * 項目名稱:BianChengXiGuan * 類名稱:Pet * 類描述:父類,寵物類 * 創(chuàng)建人:Mu Xiongxiong * 創(chuàng)建時間:2020-8-15 下午1:25:11 * 修改人:Mu Xiongxiong * 修改時間:2020-8-15 下午1:25:11 * 修改備注: * 個人博客:https://blog.csdn.net/qq_34137397 * 微信公眾號:雄雄的小課堂 * @version **/ public class Pet {/**** 構造函數(shù)* @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 * 類描述:子類,小狗類 * 創(chuàng)建人:Mu Xiongxiong * 創(chuàng)建時間: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 * 類描述:人類,其他的類 * 創(chuàng)建人:Mu Xiongxiong * 創(chuàng)建時間:2020-8-15 下午1:27:09 * 修改人:Mu Xiongxiong * 修改時間:2020-8-15 下午1:27:09 * 修改備注: * 個人博客:https://blog.csdn.net/qq_34137397 * 微信公眾號:雄雄的小課堂 * @version **/ public class People {/**** 構造函數(shù)* @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();}}這幾個類的業(yè)務其實不難,大致的瀏覽一遍之后,你會發(fā)現(xiàn),在Pet類的構造方法中初識化了People類,在People類的構造方法中初識化了Dog類,最后在測試類中調(diào)用Dog類的eat方法,你覺得代碼的運行結(jié)果是什么呢?是“小狗在吃飯?”
運行結(jié)果如下:
顯而易見,無法運行,并且報java.lang.StackOverflowError錯誤(棧內(nèi)存),分析一下為什么報此錯。
我們先從main入手查看,首先初始化了Dog類,那么程序必然會調(diào)用Dog的無參構造方法(系統(tǒng)默認創(chuàng)建了),此時,JVM會默認調(diào)用其父類Pet的構造方法,那么繼續(xù)看,Pet的構造方法又調(diào)用了初識話了People類,那么就會調(diào)用People類的無參構造方法:
然后在繼續(xù)調(diào)用Dog類的無參構造方法,JVM在調(diào)用父類的無參構造方法,在初始化People類,再調(diào)用Dog構造方法……一直在循環(huán),就造成了死循環(huán),這個異常固然就出來了。
所以,切記,不要在構造方法里面初始化其他類,別不以為然,當你的項目大了的時候,你不可能像看這個小案例似的,一眼欲穿。
參考文章:《編寫高質(zhì)量的代碼:改善java程序的151個建議》
作者:秦小波
支持作者
贊賞就不用啦,生活都不易,右下角的“在看/贊”點一下,如果感覺文章不錯,記得分享到朋友圈讓更多人知道!
往期精彩
常用插件免費下載(一),未完連載中……
接口中可以寫實現(xiàn)代碼嗎?可以,但是……一般不要寫!
最全、最詳細的配置jdk十步法!
新機必裝!那些你不知道的實用技軟件在這里!文末免費獲取
總結(jié)
以上是生活随笔為你收集整理的切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑组装前要准备的常用工具组装电脑时需要
- 下一篇: java中你知道的这四种代码块吗?