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