JAVA構(gòu)造器是否為靜態(tài)方法你知道嗎
在thinking in java中,第96頁提到,“即使沒有顯示地使用static關(guān)鍵字,構(gòu)造器實(shí)際上也是靜態(tài)方法“,對此我產(chǎn)生了疑惑,于是找相關(guān)資料進(jìn)行確認(rèn),在一篇大神的博客中得到了答案,那就是構(gòu)造器不是靜態(tài)方法。
主要是以下幾點(diǎn)原因:
Java虛擬機(jī)規(guī)范第二版中定義了四種不同的字節(jié)碼指令來處理Java程序中不同種類的方法的調(diào)用:
- invokestatic - 用于調(diào)用類(靜態(tài))方法
- invokespecial - 用于調(diào)用實(shí)例方法,特化于super方法調(diào)用、private方法調(diào)用與構(gòu)造器調(diào)用
- invokevirtual - 用于調(diào)用一般實(shí)例方法(包括聲明為final但不為private的實(shí)例方法)
- invokeinterface - 用于調(diào)用接口方法
其中,invokestatic與invokespecial調(diào)用的目標(biāo)必然是可以靜態(tài)綁定的(比如不被繼承),因?yàn)樗鼈兌紵o法參與子類型多態(tài);invokevirtual與invokeinterface的則一般需要做運(yùn)行時綁定,JVM實(shí)現(xiàn)可以有選擇的根據(jù)final或?qū)嶋H運(yùn)行時類層次或類型反饋等信息試圖進(jìn)行靜態(tài)綁定。
那么Java中的實(shí)例構(gòu)造器是不是“靜態(tài)方法”呢?從Java語言規(guī)范中給出的“靜態(tài)方法”的定義來看,答案是“否”——首先從Java語言規(guī)范對“方法”的定義來說,構(gòu)造器根本不是“方法”;其次,實(shí)例構(gòu)造器有一個隱式參數(shù),“this”,在實(shí)例構(gòu)造器中可以訪問“this”,可以通過“this”訪問到正在初始化的對象實(shí)例的所有實(shí)例成員。
實(shí)例構(gòu)造器無法被隱藏或覆寫,不參與多態(tài),因而可以做靜態(tài)綁定。從這個意義上可以認(rèn)為實(shí)例構(gòu)造器是“靜態(tài)”的,但這種用法與Java語言定義的“靜態(tài)方法”是兩碼事。
另外需要注意的是,Java語言中,實(shí)例構(gòu)造器只能在new表達(dá)式(或別的構(gòu)造器)中被調(diào)用,不能通過方法調(diào)用表達(dá)式來調(diào)用。new表達(dá)式作為一個整體保證了對象的創(chuàng)建與初始化是打包在一起進(jìn)行的,不能分開進(jìn)行;但實(shí)例構(gòu)造器只負(fù)責(zé)對象初始化的部分,“創(chuàng)建對象”的部分是由new表達(dá)式本身保證的。
這個例子的注意點(diǎn)在于:
1、Java的實(shí)例構(gòu)造器只負(fù)責(zé)初始化,不負(fù)責(zé)創(chuàng)建對象;Java虛擬機(jī)的字節(jié)碼指令的設(shè)計(jì)也反映了這一點(diǎn),有一個new指令專門用于創(chuàng)建對象實(shí)例,而調(diào)用實(shí)例構(gòu)造器則使用invokespecial指令。
2、“this”是作為實(shí)例構(gòu)造器的第一個實(shí)際參數(shù)傳入的。
靜態(tài)方法中不能使用this,而構(gòu)造器中可以使用this關(guān)鍵字。this是指調(diào)用當(dāng)前方法的對象,而靜態(tài)方法不屬于任何對象。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java中Set與List的關(guān)系與區(qū)別介紹
這篇文章主要介紹了Java中Set與List的關(guān)系與區(qū)別介紹,本文總結(jié)它們兩個接口都是繼承自Collection、它們之間的存儲方式不一樣,需要的朋友可以參考下2015-03-03詳解Java如何實(shí)現(xiàn)FP-Growth算法
學(xué)校里的實(shí)驗(yàn),要求實(shí)現(xiàn)FP-Growth算法.FP-Growth算法比Apriori算法快很多(但是卻比不上時間)在網(wǎng)上搜索后發(fā)現(xiàn)Java實(shí)現(xiàn)的FP-Growth算法很少,且大多數(shù)不太能理解):太菜.所以就自己實(shí)現(xiàn)了一下.這篇文章重點(diǎn)介紹一下我的Java實(shí)現(xiàn) ,需要的朋友可以參考下2021-06-06java 發(fā)送http和https請求的實(shí)例
下面小編就為大家分享一篇java 發(fā)送http和https請求的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Springboot實(shí)現(xiàn)自定義錯誤頁面的方法(錯誤處理機(jī)制)
這篇文章主要介紹了Springboot實(shí)現(xiàn)自定義錯誤頁面的方法(錯誤處理機(jī)制),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01spring boot實(shí)現(xiàn)圖片上傳和下載功能
這篇文章主要為大家詳細(xì)介紹了spring boot實(shí)現(xiàn)圖片上傳和下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Java線程的start方法回調(diào)run方法的操作技巧
面試過程中經(jīng)常會被面試官問到為什么我們調(diào)用start()方法時會執(zhí)行run()方法,為什么不能直接調(diào)用run()方法,問的一頭霧水,今天小編給大家介紹下Java線程的start方法回調(diào)run方法的操作技巧,需要的朋友參考下吧2017-11-11mybatis-plus配置日志兩種實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于mybatis-plus配置日志兩種實(shí)現(xiàn)方式的相關(guān)資料,Mybatis-plus集成了日志框架,可以將程序運(yùn)行時產(chǎn)生的日志進(jìn)行記錄,方便開發(fā)人員進(jìn)行問題排查,需要的朋友可以參考下2023-09-09