Java中子類是否能夠繼承父類的static變量和方法而呈現多態特性

靜態方法

一般,在一個類中定義一個方法爲static,那就是說,無需本類的對象便可調用此方法,關於static方法,聲明爲static的方法有如下幾條限制:java

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

不管是static修飾的變量,仍是static修飾的方法,咱們都知道他們是屬於類自己的,不是屬於某一個對象的,當聲明一個對象時,並不產生static變量和方法的拷貝。也就是說,用static修飾的變量和方法在類加載的時候,只分配一塊存儲空間,全部此類的對象均可以操控此塊存儲空間;測試

:這裏要說明的時,當子類沒有與之同名的static變量(或方法時),子類的對象也能夠操控這塊內存空間。可是子類並無繼承父類中static修飾的變量和方法。由於static修飾的變量和方法是屬於父類自己的。this

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

可是,不知道你有沒有注意到這種狀況,當存在繼承關係時,父類中有一個static修飾的變量(或方法),而子類中也存在一個同名的static修飾的變量(或方法)時,他們究竟是否知足「重寫」,而最終體現出多態的效果呢??code

下面來看一個例子。 
父類中有一個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

測試類string

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

運行後的結果以下:it

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

相關文章
相關標籤/搜索