時間:2020-10-07來源:www.farandoo.com作者:電腦系統城
1、父類中staitic修飾的靜態方法,不能覆蓋、不能繼承。
2、父類中staitic修飾的變量或常量,能覆蓋、不能繼承。
static修飾的變量和方法,只屬于類本身,不屬于對象;當聲明一個對象時,并不產生static變量和方法的拷貝。也就是說,用static修飾的變量和方法在類加載的時候,會分配一塊存儲空間,所有此類的對象都可以操控此塊存儲空間;
注意:當子類沒有與父類同名的static變量(或方法時),子類的對象也可操控這塊內存空間。但是,子類并沒有繼承父類中static修飾的變量和方法。這是因為static修飾的變量和方法是屬于父類本身的。
3、父類中final修飾的方法,不能覆蓋,但可繼承。
代碼示例:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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方法計算結果:" + pFResult); System.out.println( "父類靜方法計算結果:" + pResult); System.out.println( "子類靜方法計算結果:" + cResult); System.out.println( "父類final方法計算結果:" + pMResult); System.out.println( "父類靜態變量num:" + ParentClass.num); System.out.println( "子類靜態變量num:" + ChildClass.num); } } class ParentClass { public static final int num = 1 ; ParentClass() { System.out.println( "執行父類無參數構造方法" ); } 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( "執行子類無參數構造方法" ); } // @Override 無法繼承,編譯時出錯 static int add( int i, int j) { return i * j; } // 無法繼承,編譯時出錯 // int plus(int i, int j) { // return i + j; // } // 無法繼承,編譯時出錯 // int minus(int i, int j) { // return i - j; // } } |
輸出結果:
執行父類無參數構造方法
執行子類無參數構造方法
父類靜final方法計算結果:5
父類靜方法計算結果:5
子類靜方法計算結果:6
父類final方法計算結果:-1
父類靜態變量num:1
子類靜態變量num:2
補充知識:java中static、final 和 static final之間的區別
static可以修飾:全局屬性,方法,代碼塊,內部類(靜態內部類或嵌套內部類)
由于靜態屬性和方法是屬于該類的所有對象的,所以可以用類名.靜態屬性/方法名來訪問。用static修飾的代碼塊表示靜態代碼塊,當Java虛擬機(JVM)加載類時,就會執行該代碼塊。
1.被static修飾的變量,叫靜態變量或類變量(不能是局部變量),直接可以用類名調用;被static修飾的變量,叫實例變量,必須實例化對象以后調用;static修飾的變量可以被修改.
2.靜態方法可以直接通過類名調用,任何的實例也都可以調用,因此靜態方法中不能用this和super關鍵字,也不能直接訪問所屬類的實例變量和實例方法(非static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。
3.父子類中,靜態方法只能被靜態方法覆蓋,父子類中,非靜態方法只能被非靜態方法覆蓋。
常見的java中的main方法必須有static修飾,因為在類加載時無法創建對象,靜態方法可以不通過對象調用,所以在類的main方法所在在類加載時就可以通過main方法入口來運行程序。
4.static代碼塊也叫靜態代碼塊,是在類中獨立于類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先后順序依次執行它們,每個代碼塊只會被執行一次。
final可以修飾:方法,類,局部變量
對于基本類型數據,final會將值變為一個常量,創建后不能被修改;但是對于對象句柄(亦可稱作引用或者指針),final會將句柄變為一個常數(進行聲明時,必須將句柄初始化到一個具體的對象。而且不能再將句柄指向另一個對象。
但是,對象的本身是可以修改的。這一限制也適用于數組,數組也屬于對象,數組本身也是可以修改的。
方法參數中的final句柄,意味著在該方法內部,我們不能改變參數句柄指向的實際東西,也就是說在方法內部不能給形參句柄再另外賦值)。
1.final修飾的變量就會變成常量,而且應當大寫,一旦賦值不能改變,final的常量不會有默認初始值,對于直接在初始化賦值時final修飾符常和static修飾符一起使用。
2.final修飾的方法將不能被其子類覆蓋重寫。
3.final修飾的類類將不能被繼承,且final類中的方法也都是final的, final不能用來修飾構造方法,在父類中如果有常量屬性,在子類中使用常量屬性時是不會進行父類的類加載。
static final和final static
沒什么區別,一般static寫在前面,既具有static屬性又具有final屬性的類/方法/變量。
以上這篇Java父類繼承中的static和final用法就是小編分享給大家的全部內容了,希望能給大家一個參考
2020-11-11
Vue3 響應式偵聽與計算的實現2020-10-19
詳解mybatis-plus配置找不到Mapper接口路徑的坑2020-10-19
SpringBoot下使用MyBatis-Puls代碼生成器的方法