“Variable no estática, esto no se puede referenciar desde un contexto estático” al crear un objeto

Escribí el siguiente código para probar el concepto de clases y objetos en 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); } } 

¿Por qué esto me da el siguiente error en el proceso de comstackción?

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

Haga que 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); } } 

En Java existen dos tipos de clases anidadas : “clase anidada estática” y “clase interna” . Sin la palabra clave static , es una clase interna y necesitará una instancia de ShowBike para acceder a ShowBike.Bicycle :

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

Las clases anidadas estáticas y las normales (no anidadas) son casi las mismas en funcionalidad, solo formas diferentes de agrupar cosas. Sin embargo, al usar clases anidadas estáticas, no puede poner definiciones de ellas en archivos separados, lo que conducirá a un único archivo que contiene muchas definiciones de clase.

Bicycle es una clase interna, por lo que necesita una instancia de clase externa para crear una instancia de clase interna como:

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

O simplemente puede declarar la clase Bicycle como static para que su trabajo actual funcione.

El método principal no puede acceder a un miembro no estático de su clase.

Por cierto, las clases deben tener nombres de sustantivos, no de verbos. Entonces, una mejor forma de hacerlo es:

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

Necesita crear el objeto de la clase externa instate de la clase interna. o necesita hacer clase interna como estática. entonces para la clase interna no se requiere ningún objeto.

Su clase de bicicleta no es estática, y por lo tanto no se puede usar en un método no estático. Si desea usarlo en el método principal, cámbielo a

 private static class Bicycle