標籤:
首先,定義一個類A如下
- class A {
- static int a = 1;
- static int b = 2;
-
- public static void printA() {
- System.out.println(a);
- }
-
- public static void printB() {
- System.out.println(b);
- }
-
- }
class A { static int a = 1; static int b = 2; public static void printA() { System.out.println(a); } public static void printB() { System.out.println(b); }}
A中有靜態變數a,b,同時有兩個靜態方法printA()與printB(),用於列印a,b的值
再定義一個B類繼承A,B中重新定義了變數a與b,以及靜態方法printB()
- class B extends A {
- static int a = 3;
- static int b = 4;
-
- public static void printB() {
- // 如果B中沒有重新定義b,這裡調用的會是A.b,重新定義之後,調用的就是B.b
- System.out.println(b);
- }
- }
class B extends A { static int a = 3; static int b = 4; public static void printB() { // 如果B中沒有重新定義b,這裡調用的會是A.b,重新定義之後,調用的就是B.b System.out.println(b); }}
這時候,如果調用B.printA()會列印什麼呢?調用B.printB()又會列印什麼呢?不妨寫個程式測試一下,結果如下:
- public class TestOverrideStatic {
- public static void main(String[] args) {
- // B繼承自A的靜態方法,注意:B中雖然也定義了a的值(B.a),但是因為調用的printA是A中的方法,他列印的是A中的靜態變數a(A.a)的值
- B.printA(); //[1]
- // 如果B中沒有定義printB(),這裡調用的會是A中的printB(),但是因為B中也定義了B的printB(),所以這裡調用的是B自己的方法,所以
- //列印的也是B中靜態變數b(B.b)的值
- B.printB(); //[2]
- // B也可以直接調用a,如果B中沒有重新定義,就調用繼承自A的a變數,重新定義了,就調用它自身的a
- System.out.println(B.a);
- }
- }
public class TestOverrideStatic {public static void main(String[] args) {// B繼承自A的靜態方法,注意:B中雖然也定義了a的值(B.a),但是因為調用的printA是A中的方法,他列印的是A中的靜態變數a(A.a)的值B.printA(); //[1]// 如果B中沒有定義printB(),這裡調用的會是A中的printB(),但是因為B中也定義了B的printB(),所以這裡調用的是B自己的方法,所以//列印的也是B中靜態變數b(B.b)的值B.printB(); //[2]// B也可以直接調用a,如果B中沒有重新定義,就調用繼承自A的a變數,重新定義了,就調用它自身的aSystem.out.println(B.a);}}
列印結果:
1
4
3
總結:
1.靜態變數與靜態方法說繼承並不確切,靜態方法與變數是屬於類的方法與變數。而子類也屬於超類,比如說Manage extends Employee,則Manage也是一個Employee,所以子類能夠調用屬於超類的靜態變數和方法。注意,子類調用的其實就是超類的靜態方法和變數,而不是繼承自超類的靜態方法與變數。但是如果子類中有同名的靜態方法與變數,這時候調用的就是子類本身的,因為子類的靜態變數與靜態方法會隱藏父類的靜態方法和變數。
2.如果子類中沒有定義同名的變數和方法,那麼調用 "子類名.靜態方法/變數"調用的是父類的方法及變數
3,.如果子類中只定義了同名靜態變數,而沒有定義與父類同名靜態方法,則調用”子類名.靜態方法"時,調 用的是父類的靜態方法,靜態方法中的靜態變數也是父類的 (如程式中注[1])
4.如果子類中既定義了與父類同名的靜態變數,也定義了與父類同名的靜態方法,這時候調用”子類名.靜態方法"時,完全與父類無關,裡面的靜態變數也是子類的(如程式中注[2])
Java 語言靜態變數和靜態方法繼承問題(轉)