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é Thing
que 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 Thing
hará que su programa funcione.Tal como está, lo tienes
Thing
como 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 unaHello
instancia particular en alcance.Si lo declaras como una clase estática, es una clase "anidada", que no necesita una
Hello
instancia particular .fuente
outer class
,non-static inner class
también se crearía incluso si no lo uso en ningún lado?Has declarado la clase
Thing
como una clase interna no estática. Eso significa que debe estar asociado con una instancia deHello
clase.En su código, está intentando crear una instancia de
Thing
un contexto estático. De eso se queja el compilador.Hay algunas soluciones posibles. Qué solución usar depende de lo que quieras lograr.
Mover
Thing
fuera de laHello
clase.Cambiar
Thing
para ser unastatic
clase anidada.Cree una instancia de
Hello
antes de crear una instancia deThing
.La última solución (una clase anidada no estática ) sería obligatoria si alguna instancia
Thing
dependiera de una instancia deHello
ser 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
enormous
valor obvio para probar 31 en su contra. Es necesaria una instanciah
de laHello
clase externa para proporcionar esteh.enormous
valor:Porque no significa un
Thing
si 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 Classes
Algunos 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
Thing
es una clase interna con una conexión automática a una instancia deHello
. Obtiene un error de compilación porque no hay ninguna instanciaHello
para 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