2013-03-11 47 views
21

我編寫了下面的代碼來測試Java中的類和對象的概念。創建對象時「無法從靜態上下文中引用非靜態變量」

public class ShowBike { 
    private class Bicycle { 
     public int gear = 0; 
     public Bicycle(int v) { 
      gear = v; 
     } 
    } 

    public static void main() { 
     Bicycle bike = new Bicycle(5); 
     System.out.println(bike.gear); 
    } 
} 

爲什麼這會在編譯過程中給我下面的錯誤?

ShowBike.java:12: non-static variable this cannot be referenced from a static context 
     Bicycle bike = new Bicycle(5); 
        ^
+0

我不確定這是否重複。鏈接的帖子似乎並沒有涵蓋嵌套類,這就是這個問題提出的問題。 – Dukeling 2017-08-15 20:03:44

回答

39

使ShowBike.Bicycle靜態。

public class ShowBike { 

    private static class Bicycle { 
     public int gear = 0; 
     public Bicycle(int v) { 
      gear = v; 
     } 

    } 

    public static void main() { 
     Bicycle bike = new Bicycle(5); 
     System.out.println(bike.gear); 
    } 
} 

在Java中有two types of nested classes: 「Static Nested Class和」 和"Inner class"。如果沒有static關鍵字是一個內部類,您需要的ShowBike實例訪問ShowBike.Bicycle

ShowBike showBike = new ShowBike(); 
Bicycle bike = showBike.new Bicycle(5); 

靜態嵌套類和正常(非嵌套)班幾乎是在功能上是相同的,這是隻是不同的方式來分組的東西。但是,使用靜態嵌套類時,不能將它們的定義放在單獨的文件中,這將導致包含許多類定義的單個文件。

3

主要方法無法訪問其類的非靜態成員。

順便說一下,類應按名詞命名,而不是動詞。因此,一個更好的方式來做到這一點是:

private class Bicycle { 
    public int gear = 0; 

    public Bicycle(int v) { 
     gear = v; 
    } 

    public void showGear() { 
     System.out.println(gear); 
    } 

    public static void main(String[] args) { 
     Bicycle bike = new Bicycle(6); 
     bike.showGear(); // Notice that the method is named after a verb 
    } 
} 
6

自行車是一個內部類,所以你需要外部類的實例來創建內部類實例,如:

ShowBike sBike = new ShowBike(); 
Bicycle bike = sBike.new Bicycle(5); 

或者你可以簡單地聲明Bicycle類作爲static使您目前的方式工作。

1

您的Bicycle類不是靜態的,因此不能用於非靜態方法。如果您想在主要方法中使用它,請將其更改爲

private static class Bicycle 
2

您需要創建內部類的外部類對象instate。或者你需要將內部類作爲靜態。所以對於內部類來說不需要對象。

相關問題