一般,在一個類中定義一個方法爲static,那就是說,無需本類的對象便可調用此方法,關於static方法,聲明爲static的方法有如下幾條限制:java
不管是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"); } }
子類:內存
public class Son extends Parent { public static void staticMethod(){ System.out.println("Son staticMethod run"); } public void method(){ System.out.println("Son method run"); } }
測試類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();//這樣才存在多態 } }
運行後的結果以下: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 { //... }
測試類
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 } }
運行結果以下
Parent staticMethod run
Parent staticMethod run
從上面的運行結果能夠看出,static方法是能夠被子類訪問的。
2)接着來看父類的static修飾的變量,是否可以被子類繼承呢??
答案:也是不能夠的。可是也是能夠被子類訪問的。
1)子類是不繼承父類的static變量和方法的。由於這是屬於類自己的。可是子類是能夠訪問的。 2)子類和父類中同名的static變量和方法都是相互獨立的,並不存在任何的重寫的關係。