JAVA學習【2】錯誤:無法從靜態上下文中引用非靜態(轉載)

編程時遇到“錯誤:無法從靜態上下文中引用非靜態”。

輸出10到20的數字,程序如下:

[html] view plain copy
  1. public class MyCode1{  
  2.     int count=10;  
  3.   
  4.     public static void main(String args[]){  
  5.         while(count<=20){  
  6.             System.out.println(count);  
  7.             count++;  
  8.         }  
  9.     }  
  10. }  

編譯報錯:

[plain] view plain copy
  1. E:\CS碼農知識學習\mycode\MyCode1.java:5: 錯誤: 無法從靜態上下文中引用非靜態 變量 count  
  2.         while(count<=20){  
  3.               ^  
  4. E:\CS碼農知識學習\mycode\MyCode1.java:6: 錯誤: 無法從靜態上下文中引用非靜態 變量 count  
  5.             System.out.println(count);  
  6.                                ^  
  7. E:\CS碼農知識學習\mycode\MyCode1.java:7: 錯誤: 無法從靜態上下文中引用非靜態 變量 count  
  8.             count++;  
  9.             ^  
  10. 3 個錯誤  



分析:

main函數是靜態函數,在runoob.com上查看修飾符static含義,如下


Static修飾符

  • 靜態變量:

    Static關鍵字用來聲明獨立於對象的靜態變量,無論一個類實例化多少對象,它的靜態變量只有一份拷貝。 靜態變量也被成爲類變量。局部變量能被聲明爲static變量。

  • 靜態方法:

    Static關鍵字用來聲明獨立於對象的靜態方法。靜態方法不能使用類的非靜態變量。靜態方法從參數列表得到數據,然後計算這些數據。

對類變量和方法的訪問可以直接使用classname.variablename和classname.methodname的方式訪問。


靜態方法不能使用類的非靜態變量,因爲靜態方法在程序一開始就可以直接通過類調用,不需要對象實例化就可以訪問。

而程序中count是一個實例變量。


實例變量

  • 實例變量聲明在一個類中,但在方法、構造方法和語句塊之外;
  • 當一個對象被實例化之後,每個實例變量的值就跟着確定;
  • 實例變量在對象創建的時候創建,在對象被銷燬的時候銷燬;
  • 實例變量的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取實例變量信息;
  • 實例變量可以聲明在使用前或者使用後;
  • 訪問修飾符可以修飾實例變量;
  • 實例變量對於類中的方法、構造方法或者語句塊是可見的。一般情況下應該把實例變量設爲私有。通過使用訪問修飾符可以使實例變量對子類可見;
  • 實例變量具有默認值。數值型變量的默認值是0,布爾型變量的默認值是false,引用類型變量的默認值是null。變量的值可以在聲明時指定,也可以在構造方法中指定;
  • 實例變量可以直接通過變量名訪問。但在靜態方法以及其他類中,就應該使用完全限定名:ObejectReference.VariableName。

由上可知,實例變量count在對象創建時纔會創建,而程序中,並未創建對象。

針對以上問題

方法1、將count放到main函數中

[java] view plain copy
  1. public class MyCode1{  
  2.   
  3.   
  4.     public static void main(String args[]){  
  5.         int count=10;  
  6.         while(count<=20){  
  7.             System.out.println(count);  
  8.             count++;  
  9.         }  
  10.     }  
  11. }  



方法2、創建對象,調用對象的實例變量

[java] view plain copy
  1. public class MyCode1{  
  2.     int count=10;  
  3.   
  4.     public static void main(String args[]){  
  5.         MyCode1 code1 = new MyCode1();  
  6.   
  7.         while(code1.count<=20){  
  8.             System.out.println(code1.count);  
  9.             code1.count++;  
  10.         }  
  11.     }  
  12. }  

方法3、將count更改成靜態變量

[java] view plain copy
  1. public class MyCode1{  
  2.     static int count=10;  
  3.   
  4.     public static void main(String args[]){  
  5.         while(count<=20){  
  6.             System.out.println(count);  
  7.             count++;  
  8.         }  
  9.     }  
  10. }  






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章