Java父類繼承中的static和final用法
1、父類中staitic修飾的靜態(tài)方法,不能覆蓋、不能繼承。
2、父類中staitic修飾的變量或常量,能覆蓋、不能繼承。
static修飾的變量和方法,只屬于類本身,不屬于對(duì)象;當(dāng)聲明一個(gè)對(duì)象時(shí),并不產(chǎn)生static變量和方法的拷貝。也就是說(shuō),用static修飾的變量和方法在類加載的時(shí)候,會(huì)分配一塊存儲(chǔ)空間,所有此類的對(duì)象都可以操控此塊存儲(chǔ)空間;
注意:當(dāng)子類沒(méi)有與父類同名的static變量(或方法時(shí)),子類的對(duì)象也可操控這塊內(nèi)存空間。但是,子類并沒(méi)有繼承父類中static修飾的變量和方法。這是因?yàn)閟tatic修飾的變量和方法是屬于父類本身的。
3、父類中final修飾的方法,不能覆蓋,但可繼承。
代碼示例:
package com.jdk; /** * Created by Liuxd on 2018-11-02. */ public class TestExtendsClass { public static void main(String[] args) { ParentClass parentClass = new ChildClass(); System.out.println(); int pFResult = ParentClass.plus(3,2); int pResult = ParentClass.add(3,2); int cResult = ChildClass.add(3,2); int pMResult = parentClass.minus(2,3); System.out.println("父類靜final方法計(jì)算結(jié)果:" + pFResult); System.out.println("父類靜方法計(jì)算結(jié)果:" + pResult); System.out.println("子類靜方法計(jì)算結(jié)果:" + cResult); System.out.println("父類final方法計(jì)算結(jié)果:" + pMResult); System.out.println("父類靜態(tài)變量num:" + ParentClass.num); System.out.println("子類靜態(tài)變量num:" + ChildClass.num); } } class ParentClass { public static final int num = 1; ParentClass() { System.out.println("執(zhí)行父類無(wú)參數(shù)構(gòu)造方法"); } static int add(int i, int j) { return i + j; } static final int plus(int i, int j) { return i + j; } final int minus(int i, int j) { return i - j; } } class ChildClass extends ParentClass { public static final int num = 2; ChildClass() { System.out.println("執(zhí)行子類無(wú)參數(shù)構(gòu)造方法"); } // @Override 無(wú)法繼承,編譯時(shí)出錯(cuò) static int add(int i, int j) { return i * j; } // 無(wú)法繼承,編譯時(shí)出錯(cuò) // int plus(int i, int j) { // return i + j; // } // 無(wú)法繼承,編譯時(shí)出錯(cuò) // int minus(int i, int j) { // return i - j; // } }
輸出結(jié)果:
執(zhí)行父類無(wú)參數(shù)構(gòu)造方法
執(zhí)行子類無(wú)參數(shù)構(gòu)造方法
父類靜final方法計(jì)算結(jié)果:5
父類靜方法計(jì)算結(jié)果:5
子類靜方法計(jì)算結(jié)果:6
父類final方法計(jì)算結(jié)果:-1
父類靜態(tài)變量num:1
子類靜態(tài)變量num:2
補(bǔ)充知識(shí):java中static、final 和 static final之間的區(qū)別
static可以修飾:全局屬性,方法,代碼塊,內(nèi)部類(靜態(tài)內(nèi)部類或嵌套內(nèi)部類)
由于靜態(tài)屬性和方法是屬于該類的所有對(duì)象的,所以可以用類名.靜態(tài)屬性/方法名來(lái)訪問(wèn)。用static修飾的代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(jī)(JVM)加載類時(shí),就會(huì)執(zhí)行該代碼塊。
1.被static修飾的變量,叫靜態(tài)變量或類變量(不能是局部變量),直接可以用類名調(diào)用;被static修飾的變量,叫實(shí)例變量,必須實(shí)例化對(duì)象以后調(diào)用;static修飾的變量可以被修改.
2.靜態(tài)方法可以直接通過(guò)類名調(diào)用,任何的實(shí)例也都可以調(diào)用,因此靜態(tài)方法中不能用this和super關(guān)鍵字,也不能直接訪問(wèn)所屬類的實(shí)例變量和實(shí)例方法(非static的成員變量和成員成員方法),只能訪問(wèn)所屬類的靜態(tài)成員變量和成員方法。
3.父子類中,靜態(tài)方法只能被靜態(tài)方法覆蓋,父子類中,非靜態(tài)方法只能被非靜態(tài)方法覆蓋。
常見(jiàn)的java中的main方法必須有static修飾,因?yàn)樵陬惣虞d時(shí)無(wú)法創(chuàng)建對(duì)象,靜態(tài)方法可以不通過(guò)對(duì)象調(diào)用,所以在類的main方法所在在類加載時(shí)就可以通過(guò)main方法入口來(lái)運(yùn)行程序。
4.static代碼塊也叫靜態(tài)代碼塊,是在類中獨(dú)立于類成員的static語(yǔ)句塊,可以有多個(gè),位置可以隨便放,它不在任何的方法體內(nèi),JVM加載類時(shí)會(huì)執(zhí)行這些靜態(tài)的代碼塊,如果static代碼塊有多個(gè),JVM將按照它們?cè)陬愔谐霈F(xiàn)的先后順序依次執(zhí)行它們,每個(gè)代碼塊只會(huì)被執(zhí)行一次。
final可以修飾:方法,類,局部變量
對(duì)于基本類型數(shù)據(jù),final會(huì)將值變?yōu)橐粋€(gè)常量,創(chuàng)建后不能被修改;但是對(duì)于對(duì)象句柄(亦可稱作引用或者指針),final會(huì)將句柄變?yōu)橐粋€(gè)常數(shù)(進(jìn)行聲明時(shí),必須將句柄初始化到一個(gè)具體的對(duì)象。而且不能再將句柄指向另一個(gè)對(duì)象。
但是,對(duì)象的本身是可以修改的。這一限制也適用于數(shù)組,數(shù)組也屬于對(duì)象,數(shù)組本身也是可以修改的。
方法參數(shù)中的final句柄,意味著在該方法內(nèi)部,我們不能改變參數(shù)句柄指向的實(shí)際東西,也就是說(shuō)在方法內(nèi)部不能給形參句柄再另外賦值)。
1.final修飾的變量就會(huì)變成常量,而且應(yīng)當(dāng)大寫(xiě),一旦賦值不能改變,final的常量不會(huì)有默認(rèn)初始值,對(duì)于直接在初始化賦值時(shí)final修飾符常和static修飾符一起使用。
2.final修飾的方法將不能被其子類覆蓋重寫(xiě)。
3.final修飾的類類將不能被繼承,且final類中的方法也都是final的, final不能用來(lái)修飾構(gòu)造方法,在父類中如果有常量屬性,在子類中使用常量屬性時(shí)是不會(huì)進(jìn)行父類的類加載。
static final和final static
沒(méi)什么區(qū)別,一般static寫(xiě)在前面,既具有static屬性又具有final屬性的類/方法/變量。
以上這篇Java父類繼承中的static和final用法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redisson延遲隊(duì)列執(zhí)行流程源碼解析
這篇文章主要為大家介紹了Redisson延遲隊(duì)列執(zhí)行流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Java實(shí)現(xiàn)添加頁(yè)碼到PDF文檔
頁(yè)碼可以清楚了解總頁(yè)數(shù)、定位頁(yè)數(shù)快速尋找自己所要的文段、打印時(shí)不會(huì)分不清頭中尾。今天這篇文章就將介紹如何通過(guò)Java代碼,以編程的方式將添加頁(yè)碼到PDF文檔,需要的可以參考一下2023-04-04Java并發(fā)編程之LongAdder執(zhí)行情況解析
這篇文章主要為大家介紹了Java并發(fā)編程之LongAdder執(zhí)行情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04基于SpringBoot bootstrap.yml配置未生效的解決
這篇文章主要介紹了基于SpringBoot bootstrap.yml配置未生效的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10SpringBoot 錯(cuò)誤處理機(jī)制與自定義錯(cuò)誤處理實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringBoot 錯(cuò)誤處理機(jī)制與自定義錯(cuò)誤處理實(shí)現(xiàn)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11kafka并發(fā)寫(xiě)大消息異常TimeoutException排查記錄
這篇文章主要為大家介紹了kafka并發(fā)寫(xiě)大消息異常TimeoutException的排查記錄及解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02基于Java swing組件實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
這篇文章主要介紹了基于Java swing組件實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java實(shí)現(xiàn)迷你圖書(shū)管理系統(tǒng)案例全程
這篇文章主要為大家詳細(xì)介紹了如何利用java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-12-12Spring的FactoryBean<Object>接口示例代碼
FactoryBean是Spring框架中的一個(gè)接口,用于創(chuàng)建和管理Bean對(duì)象,它的作用是將Bean的創(chuàng)建過(guò)程交給FactoryBean實(shí)現(xiàn)類來(lái)完成,而不是直接由Spring容器來(lái)創(chuàng)建,本文給大家介紹Spring的FactoryBean<Object>接口,感興趣的朋友一起看看吧2023-11-11