Java 語言靜態變數和靜態方法繼承問題

來源:互聯網
上載者:User

標籤:

        首先,定義一個類A如下

  1. class A {  
  2.     static int a = 1;  
  3.     static int b = 2;  
  4.   
  5.     public static void printA() {  
  6.         System.out.println(a);  
  7.     }  
  8.   
  9.     public static void printB() {  
  10.         System.out.println(b);  
  11.     }  
  12.   
  13. }  
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()         

  1. class B extends A {  
  2.     static int a = 3;  
  3.     static int b = 4;  
  4.   
  5.     public static void printB() {  
  6.         // 如果B中沒有重新定義b,這裡調用的會是A.b,重新定義之後,調用的就是B.b   
  7.         System.out.println(b);  
  8.     }  
  9. }  
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()又會列印什麼呢?不妨寫個程式測試一下,結果如下:  

  1. public class TestOverrideStatic {  
  2.     public static void main(String[] args) {  
  3.         // B繼承自A的靜態方法,注意:B中雖然也定義了a的值(B.a),但是因為調用的printA是A中的方法,他列印的是A中的靜態變數a(A.a)的值   
  4.         B.printA(); //[1]   
  5.         // 如果B中沒有定義printB(),這裡調用的會是A中的printB(),但是因為B中也定義了B的printB(),所以這裡調用的是B自己的方法,所以   
  6.         //列印的也是B中靜態變數b(B.b)的值   
  7.         B.printB(); //[2]   
  8.         // B也可以直接調用a,如果B中沒有重新定義,就調用繼承自A的a變數,重新定義了,就調用它自身的a   
  9.         System.out.println(B.a);  
  10.     }  
  11. }  
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 語言靜態變數和靜態方法繼承問題(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.