2013-03-11 48 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。或者你需要将内部类作为静态。所以对于内部类来说不需要对象。

相关问题