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變量和方法都是相互獨立的,並不存在任何的重寫的關系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM