“创建对象时,无法从静态上下文引用非静态变量”

我编写了下面的代码来测试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); ^ 

使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中,有两种类型的嵌套类 :“静态嵌套类”和“内部类” 。 没有static关键字,它是一个内部类,你需要一个ShowBike实例来访问ShowBike.Bicycle

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

静态嵌套类和普通(非嵌套)类在function上几乎相同,它只是分组事物的不同方式。 但是,在使用静态嵌套类时,不能将它们的定义放在单独的文件中,这将导致包含大量类定义的单个文件。

Bicycle是一个内部类,所以你需要外部类实例来创建内部类实例,如:

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

或者您可以简单地将Bicycle类声明为static以使您当前的工作方式。

main方法无法访问其类的非静态成员。

顺便说一下,类应该以名词命名,而不是动词。 所以更好的方法是:

 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 } } 

您需要创建内部类的外部类对象instate。 或者你需要将内部类作为静态。 因此对于内部类,不需要任何对象。

您的Bicycle类不是静态的,因此不能用于非静态方法。 如果要在main方法中使用它,请将其更改为

 private static class Bicycle