JAVA構(gòu)造器是否為靜態(tài)方法你知道嗎
在thinking in java中,第96頁(yè)提到,“即使沒(méi)有顯示地使用static關(guān)鍵字,構(gòu)造器實(shí)際上也是靜態(tài)方法“,對(duì)此我產(chǎn)生了疑惑,于是找相關(guān)資料進(jìn)行確認(rèn),在一篇大神的博客中得到了答案,那就是構(gòu)造器不是靜態(tài)方法。
主要是以下幾點(diǎn)原因:
Java虛擬機(jī)規(guī)范第二版中定義了四種不同的字節(jié)碼指令來(lái)處理Java程序中不同種類(lèi)的方法的調(diào)用:
- invokestatic - 用于調(diào)用類(lèi)(靜態(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(wú)法參與子類(lèi)型多態(tài);invokevirtual與invokeinterface的則一般需要做運(yùn)行時(shí)綁定,JVM實(shí)現(xiàn)可以有選擇的根據(jù)final或?qū)嶋H運(yùn)行時(shí)類(lèi)層次或類(lèi)型反饋等信息試圖進(jìn)行靜態(tài)綁定。
那么Java中的實(shí)例構(gòu)造器是不是“靜態(tài)方法”呢?從Java語(yǔ)言規(guī)范中給出的“靜態(tài)方法”的定義來(lái)看,答案是“否”——首先從Java語(yǔ)言規(guī)范對(duì)“方法”的定義來(lái)說(shuō),構(gòu)造器根本不是“方法”;其次,實(shí)例構(gòu)造器有一個(gè)隱式參數(shù),“this”,在實(shí)例構(gòu)造器中可以訪問(wèn)“this”,可以通過(guò)“this”訪問(wèn)到正在初始化的對(duì)象實(shí)例的所有實(shí)例成員。
實(shí)例構(gòu)造器無(wú)法被隱藏或覆寫(xiě),不參與多態(tài),因而可以做靜態(tài)綁定。從這個(gè)意義上可以認(rèn)為實(shí)例構(gòu)造器是“靜態(tài)”的,但這種用法與Java語(yǔ)言定義的“靜態(tài)方法”是兩碼事。
另外需要注意的是,Java語(yǔ)言中,實(shí)例構(gòu)造器只能在new表達(dá)式(或別的構(gòu)造器)中被調(diào)用,不能通過(guò)方法調(diào)用表達(dá)式來(lái)調(diào)用。new表達(dá)式作為一個(gè)整體保證了對(duì)象的創(chuàng)建與初始化是打包在一起進(jìn)行的,不能分開(kāi)進(jìn)行;但實(shí)例構(gòu)造器只負(fù)責(zé)對(duì)象初始化的部分,“創(chuàng)建對(duì)象”的部分是由new表達(dá)式本身保證的。
這個(gè)例子的注意點(diǎn)在于:
1、Java的實(shí)例構(gòu)造器只負(fù)責(zé)初始化,不負(fù)責(zé)創(chuàng)建對(duì)象;Java虛擬機(jī)的字節(jié)碼指令的設(shè)計(jì)也反映了這一點(diǎn),有一個(gè)new指令專(zhuān)門(mén)用于創(chuàng)建對(duì)象實(shí)例,而調(diào)用實(shí)例構(gòu)造器則使用invokespecial指令。
2、“this”是作為實(shí)例構(gòu)造器的第一個(gè)實(shí)際參數(shù)傳入的。
靜態(tài)方法中不能使用this,而構(gòu)造器中可以使用this關(guān)鍵字。this是指調(diào)用當(dāng)前方法的對(duì)象,而靜態(tài)方法不屬于任何對(duì)象。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java結(jié)合Swing實(shí)現(xiàn)龍年祝福語(yǔ)生成工具
Swing是一個(gè)為Java設(shè)計(jì)的GUI工具包,屬于Java基礎(chǔ)類(lèi)的一部分,本文將使用Java和Swing實(shí)現(xiàn)龍年祝福語(yǔ)生成工具,感興趣的小伙伴可以了解下2024-01-01
SpringCloudAlibaba整合Feign實(shí)現(xiàn)遠(yuǎn)程HTTP調(diào)用的簡(jiǎn)單示例
這篇文章主要介紹了SpringCloudAlibaba 整合 Feign 實(shí)現(xiàn)遠(yuǎn)程 HTTP 調(diào)用,文章中使用的是OpenFeign,是Spring社區(qū)開(kāi)發(fā)的組件,需要的朋友可以參考下2021-09-09
java通過(guò)ip獲取客戶(hù)端Mac地址的小例子
java通過(guò)ip獲取客戶(hù)端Mac地址的小例子,需要的朋友可以參考一下2013-03-03
深入了解Java中的過(guò)濾器Filter和監(jiān)聽(tīng)器Listener
這篇文章主要為大家詳細(xì)介紹了Java中的過(guò)濾器Filter和監(jiān)聽(tīng)器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06
使用Spring?Cloud?Stream處理事件的示例詳解
Spring?Cloud?Stream?是基于?Spring?Boot?的用于構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架,本文主要介紹了如何使用?Spring?Cloud?Stream?來(lái)處理事件,需要的可以參考一下2023-06-06

