1. 程式人生 > >轉:Java中子類是否可以繼承父類的static變量和方法而呈現多態特性

轉:Java中子類是否可以繼承父類的static變量和方法而呈現多態特性

... test 關系 一個 道理 -c class 靜態 這一

原文地址:Java中子類是否可以繼承父類的static變量和方法而呈現多態特性

靜態方法

通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法,關於static方法,聲明為static的方法有以下幾條限制:

  • 它們僅能調用其他的static 方法。
  • 它們只能訪問static數據。
  • 它們不能以任何方式引用this 或super。

無論是static修飾的變量,還是static修飾的方法,我們都知道他們是屬於類本身的,不是屬於某一個對象的,當聲明一個對象時,並不產生static變量和方法的拷貝。也就是說,用static修飾的變量和方法在類加載的時候,只分配一塊存儲空間,所有此類的對象都可以操控此塊存儲空間;

:這裏要說明的時,當子類沒有與之同名的static變量(或方法時),子類的對象也可以操控這塊內存空間。但是子類並沒有繼承父類中static修飾的變量和方法。因為static修飾的變量和方法是屬於父類本身的。

//————————以上我相信我們每個人都比較清楚。

但是,不知道你有沒有註意到這種情況,當存在繼承關系時,父類中有一個static修飾的變量(或方法),而子類中也存在一個同名的static修飾的變量(或方法)時,他們到底是否滿足“重寫”,而最終體現出多態的效果呢??

下面來看一個例子。
父類中有一個static修飾的方法和一個普通的方法,子類中也有一個同名的static方法和一個普通的方法。如下

父類


public class Parent {
    public static void  staticMethod(){
        System.out.println("Parent staticMethod run");

    }
    public void method(){
        System.out.println("Parent method run");

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

子類


public class Son extends Parent {
    public static void  staticMethod(){
        System.out.println("Son staticMethod run");

    }
    public void method(){
        System.out.println("Son method run");

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

測試類

package com.wrh.teststaticmethod;

public class Test {

    public static void main(String[] args) {
        Parent child=new Son();
        child.staticMethod();//輸出:Parent staticMethod run

        Son s=new Son();
        s.staticMethod();
        child.method();//這樣才存在多態        

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

運行後的結果如下:

Parent staticMethod run
Son staticMethod run
Son method run

從結果可以看出:對於靜態方法在子類中是不存在“重寫”這一說的,就像前面我們提到的,用static關鍵字修飾的方法和變量都是屬於類自己本身的,即使存在繼承關系,子類並沒有繼承父類的static修飾的變量和方法,所以說即使子類和父類中都有同樣的static方法和變量,他們是沒有任何關系的,他們是相互獨立的,他們是屬於各自類本身的。因此也是不存在多態特性的。而對於普通方法的調用是存在“重寫”而最終呈現出多態特性的。

同樣的道理:對於static修飾的變量,當子類與父類中存在相同的static變量時,也是根據“靜態引用”而不是根據“動態引用”來調用相應的變量的。

而在父類和子類中對於非static變量和方法,是根據“動態引用”來調用相應的變量和方法。

然而,接著會有這樣的問題存在:java中 子類會不會繼承父類的static變量和static方法

1)先說static方法:子類會不會繼承父類的static方法呢??答案是:不會的,但是是可以訪問的。

看如下的代碼

public class Parent {
    public static void  staticMethod(){
        System.out.println("Parent staticMethod run");

    }

}
public class Son extends Parent {
    //...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

測試類

package com.wrh.teststaticmethod;

public class Test {

    public static void main(String[] args) {
        Parent child=new Son();
        child.staticMethod();//輸出:Parent staticMethod run   
        Son s=new Son();
        s.staticMethod();//輸出:Parent staticMethod run   


    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

運行結果如下

Parent staticMethod run
Parent staticMethod run

從上面的運行結果可以看出,static方法是可以被子類訪問的。

2)接著來看父類的static修飾的變量,是否能夠被子類繼承呢??
答案:也是不可以的。但是也是可以被子類訪問的。

小結

1)子類是不繼承父類的static變量和方法的。因為這是屬於類本身的。但是子類是可以訪問的。
2)子類和父類中同名的static變量和方法都是相互獨立的,並不存在任何的重寫的關系。

轉:Java中子類是否可以繼承父類的static變量和方法而呈現多態特性