1. 程式人生 > 程式設計 >Java父類繼承中的static和final用法

Java父類繼承中的static和final用法

1、父類中staitic修飾的靜態方法,不能覆蓋、不能繼承。

2、父類中staitic修飾的變數或常量,能覆蓋、不能繼承。

static修飾的變數和方法,只屬於類本身,不屬於物件;當宣告一個物件時,並不產生static變數和方法的拷貝。也就是說,用static修飾的變數和方法在類載入的時候,會分配一塊儲存空間,所有此類的物件都可以操控此塊儲存空間;

注意:當子類沒有與父類同名的static變數(或方法時),子類的物件也可操控這塊記憶體空間。但是,子類並沒有繼承父類中static修飾的變數和方法。這是因為static修飾的變數和方法是屬於父類本身的。

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方法計算結果:" + 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用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。