編程時遇到“錯誤:無法從靜態上下文中引用非靜態”。
輸出10到20的數字,程序如下:
- public class MyCode1{
- int count=10;
- public static void main(String args[]){
- while(count<=20){
- System.out.println(count);
- count++;
- }
- }
- }
編譯報錯:
- E:\CS碼農知識學習\mycode\MyCode1.java:5: 錯誤: 無法從靜態上下文中引用非靜態 變量 count
- while(count<=20){
- ^
- E:\CS碼農知識學習\mycode\MyCode1.java:6: 錯誤: 無法從靜態上下文中引用非靜態 變量 count
- System.out.println(count);
- ^
- E:\CS碼農知識學習\mycode\MyCode1.java:7: 錯誤: 無法從靜態上下文中引用非靜態 變量 count
- count++;
- ^
- 3 個錯誤
分析:
main函數是靜態函數,在runoob.com上查看修飾符static含義,如下
Static修飾符
-
靜態變量:
Static關鍵字用來聲明獨立於對象的靜態變量,無論一個類實例化多少對象,它的靜態變量只有一份拷貝。 靜態變量也被成爲類變量。局部變量能被聲明爲static變量。
-
靜態方法:
Static關鍵字用來聲明獨立於對象的靜態方法。靜態方法不能使用類的非靜態變量。靜態方法從參數列表得到數據,然後計算這些數據。
對類變量和方法的訪問可以直接使用classname.variablename和classname.methodname的方式訪問。
靜態方法不能使用類的非靜態變量,因爲靜態方法在程序一開始就可以直接通過類調用,不需要對象實例化就可以訪問。
而程序中count是一個實例變量。
實例變量
- 實例變量聲明在一個類中,但在方法、構造方法和語句塊之外;
- 當一個對象被實例化之後,每個實例變量的值就跟着確定;
- 實例變量在對象創建的時候創建,在對象被銷燬的時候銷燬;
- 實例變量的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取實例變量信息;
- 實例變量可以聲明在使用前或者使用後;
- 訪問修飾符可以修飾實例變量;
- 實例變量對於類中的方法、構造方法或者語句塊是可見的。一般情況下應該把實例變量設爲私有。通過使用訪問修飾符可以使實例變量對子類可見;
- 實例變量具有默認值。數值型變量的默認值是0,布爾型變量的默認值是false,引用類型變量的默認值是null。變量的值可以在聲明時指定,也可以在構造方法中指定;
- 實例變量可以直接通過變量名訪問。但在靜態方法以及其他類中,就應該使用完全限定名:ObejectReference.VariableName。
由上可知,實例變量count在對象創建時纔會創建,而程序中,並未創建對象。
針對以上問題
方法1、將count放到main函數中
- public class MyCode1{
- public static void main(String args[]){
- int count=10;
- while(count<=20){
- System.out.println(count);
- count++;
- }
- }
- }
方法2、創建對象,調用對象的實例變量
- public class MyCode1{
- int count=10;
- public static void main(String args[]){
- MyCode1 code1 = new MyCode1();
- while(code1.count<=20){
- System.out.println(code1.count);
- code1.count++;
- }
- }
- }
方法3、將count更改成靜態變量
- public class MyCode1{
- static int count=10;
- public static void main(String args[]){
- while(count<=20){
- System.out.println(count);
- count++;
- }
- }
- }