[javase學習筆記]-7.10 static關鍵字使用的注意細節

來源:互聯網
上載者:User

[javase學習筆記]-7.10 static關鍵字使用的注意細節

這一節我們看靜態在使用過程中應注意的幾個細節。

上一節我們在學習成員變數與靜態變數的區別時,對於兩種變數的調用方式不同時出現了“無法從靜態上下文中訪問非靜態變數”的錯誤,這個問題我們在以後會經常遇到。那麼這是什麼問題呢?我們從例子說起,我們把上一節中的Person類中方法printInfo進行靜態修飾:

class Person{String name;//姓名,這是一個成員變數static String country = "中國";//國籍,這是一個靜態變數public static void printInfo(){System.out.println(name+":"+country);}}class StaticTest {public static void main(String[] args) {Person p = new Person();p.name = "小強";p.printInfo();}}

結果:

我們看到了一個和上一節完全相同的錯誤,而當我們把方法進行修改:

 

public static void printInfo(){System.out.println(":"+country);}

結果:

我們看到當把printInfo方法中的非靜態變數name去掉之後,程式正常運行,因此我們可以總結出static關鍵字使用中的一個常見問題,即:

第一個細節:靜態方法中不能調用非靜態成員,只能調用靜態成員.這是由於我們知道靜態成員是隨著類的載入而存在,是先於對象存在的,而非靜態成員變數是隨著對象的建立而存在,所以當我們在靜態方法中調用非靜態成員時,還沒有建立對象,當然就不存在非靜態變數.比如我們上面的例子,靜態方法printInfo和靜態變數country都會隨著Person類的載入而載入,而成員變數name只有隨著Person對象的建立才會存在,當我們在靜態方法中直接調用name時,此時根本就不存在,當然會出錯.

當然對於這個細節,也可以說是靜態方法的一個局限性.非靜態方法既可以訪問靜態成員,也可以訪問非靜態成員.

我們再看下一個比較常見的問題.

第二個細節:靜態方法中不可以使用this或者super關鍵字.原因當然可以用靜態特點解釋,super我們還沒有學習,這裡暫不說明,就拿this關鍵字來說,我們說this代表對象,那麼當我們在靜態方法中使用this時,this代表的就是當前類的執行個體,而靜態方法和類是一起存在的,而該類的對象並不存在,所以會出錯.我們看一個例子:

 

class Person{String name;static String country = "中國";public static void printInfo(){System.out.println(this.name+":"+country);}}

 

結果:

我們很清楚的就看到這是不合法的.

第三個細節:主函數是靜態.這個我們大家肯定都不陌生,我們從開始學習就在搞main函數,它的正確格式是:

 

public static void main(String[] args) 
那麼我們再來看一個例子:

 

 

class StaticTest {int num = 4;public static void main(String[] args) {printNum();}public void printNum(){System.out.println(num);}}
結果:

 

我們會發現我們沒有用好第一個細節,所以我們進一步修改:

 

class StaticTest {int num = 4;public static void main(String[] args) {printNum();}public static void printNum(){System.out.println(num);}}
結果:

 

哦,還有一個非靜態成員變數,再一次修改:

這個過程真麻煩哦,那麼我們是不是要在主函數中調用的成員都是靜態呢?如果真是這樣,那麼要對象幹什麼呢?我們知道主函數是程式的入口,對於物件導向語言,那麼主函數也就對象訪問的入口,是指揮對象工作的,如果沒有對象不知道有多麼可怕啊.

我們之前學習了兩種調用方式,一種是通過類名調用,而另一種方式就是通過對象調用,那麼我們為了規避靜態局限性,我們把上面的方法進行非靜態化,並且通過對象去調用:

 

class StaticTest {int num = 4;public static void main(String[] args) {new StaticTest().printNum();}public void printNum(){System.out.println(num);}}
並且程式正常運行了.

第四個細節:在本類中,非靜態成員前面省略的是this,而在靜態成員前面省略的卻是類名.比如上面的代碼,實際上在Person類中,成員變數name前面省略的this,即this.name,而在靜態變數country前面省略的類名Person,即Person.country,這一點我們在以後的使用多注意就可以了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.