Tengo el siguiente código:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Sé Thingque no hace nada, pero mi programa Hello, World se compila muy bien sin él. Son solo mis clases definidas las que me están fallando.
Y se niega a compilar. Llego No enclosing instance of type Hello is accessible."a la línea que crea una nueva Cosa. Supongo que tampoco:
- Tengo problemas a nivel del sistema (ya sea en DrJava o en mi instalación de Java) o
- Tengo algunos malentendidos básicos sobre cómo construir un programa de trabajo en Java.
¿Algunas ideas?
java
inner-classes
coolpapa
fuente
fuente

Respuestas:
static class Thinghará que su programa funcione.Tal como está, lo tienes
Thingcomo una clase interna, que (por definición) está asociada con una instancia particular deHello(incluso si nunca la usa o se refiere a ella), lo que significa que es un error decirnew Thing();sin tener unaHelloinstancia particular en alcance.Si lo declaras como una clase estática, es una clase "anidada", que no necesita una
Helloinstancia particular .fuente
outer class,non-static inner classtambién se crearía incluso si no lo uso en ningún lado?Has declarado la clase
Thingcomo una clase interna no estática. Eso significa que debe estar asociado con una instancia deHelloclase.En su código, está intentando crear una instancia de
Thingun contexto estático. De eso se queja el compilador.Hay algunas soluciones posibles. Qué solución usar depende de lo que quieras lograr.
Mover
Thingfuera de laHelloclase.Cambiar
Thingpara ser unastaticclase anidada.Cree una instancia de
Helloantes de crear una instancia deThing.La última solución (una clase anidada no estática ) sería obligatoria si alguna instancia
Thingdependiera de una instancia deHelloser significativa. Por ejemplo, si tuviéramos:Cualquier intento en bruto de crear un objeto de clase
Thing, como en:sería problemático, ya que no habría un
enormousvalor obvio para probar 31 en su contra. Es necesaria una instanciahde laHelloclase externa para proporcionar esteh.enormousvalor:Porque no significa un
Thingsi no tiene unHello.Para obtener más información sobre clases anidadas / internas: Clases anidadas (los tutoriales de Java)
fuente
Thing thing1 <<HelloInstantiation>>.new Thing()es la clave. Pasé unos minutos confundido usando la sintaxisThing thing1 new <<HelloInstantiation>>.Thing(). = PBueno ... muchas buenas respuestas pero quiero agregar más. Una breve mirada a la clase interna en Java: Java nos permite definir una clase dentro de otra clase y ser capaz de anidar clases de esta manera tiene ciertas ventajas:
Puede ocultar (aumenta la encapsulación) la clase de otras clases, especialmente relevante si la clase solo está siendo utilizada por la clase en la que está contenida. En este caso, no es necesario que el mundo exterior lo sepa.
Puede hacer que el código sea más fácil de mantener ya que las clases se agrupan lógicamente en torno a donde se necesitan.
La clase interna tiene acceso a las variables de instancia y métodos de su clase que contiene.
Tenemos principalmente tres tipos de
Inner ClassesAlgunos de los puntos importantes para recordar
Intentemos ver los conceptos anteriores prácticamente_
Espero que esto ayude a todos. Por favor refiérase para más
fuente
Thinges una clase interna con una conexión automática a una instancia deHello. Obtiene un error de compilación porque no hay ninguna instanciaHellopara que se adjunte. Puede solucionarlo más fácilmente cambiándolo a una clase anidada estática que no tiene conexión:fuente
Vamos a entenderlo con el siguiente ejemplo simple. Esto sucede porque se trata de una CLASE INTERNA NO ESTÁTICA. Debería necesitar la instancia de la clase externa.
fuente