method inner java inner-classes

inner - protected class java



Java-No se puede acceder a ninguna instancia adjunta de tipo Foo (5)

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é que Thing no hace nada, pero mi programa Hello, World se compila bien sin eso. Solo mis clases definidas me están fallando.

Y se niega a compilar. No se puede acceder a No enclosing instance of type Hello is accessible." en la línea que crea una nueva Cosa. Supongo que:

  1. Tengo problemas a nivel del sistema (ya sea en DrJava o mi instalación de Java) o
  2. Tengo algunos malentendidos básicos sobre cómo construir un programa de trabajo en java.

¿Algunas ideas?


Bueno ... muchas respuestas buenas, pero quiero agregar más. Un breve vistazo a la clase interna en Java-Java nos permite definir una clase dentro de otra clase y el hecho de poder anidar clases de esta manera tiene ciertas ventajas:

  1. Puede ocultar (aumenta la encapsulación) la clase de otras clases, especialmente relevante si la clase solo está siendo utilizada por la clase que contiene. En este caso, no es necesario que el mundo exterior lo sepa.

  2. 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.

  3. La clase interna tiene acceso a las variables de instancia y los métodos de su clase contenedora.

Tenemos principalmente tres tipos de Inner Classes

  1. Local interno
  2. Clase interna estática
  3. Clase Interna Anónima

Algunos de los puntos importantes a recordar.

  • Necesitamos objeto de clase para acceder a la Clase Interna Local en la que existe.
  • Se puede acceder directamente a la clase interna estática, igual que cualquier otro método estático de la misma clase en la que existe.
  • Las Clases internas anónimas no son visibles ni fuera del mundo ni de los otros métodos o clases de la misma clase (en la que existe) y se utilizan en el punto en el que se declaran.

Intentemos ver los conceptos anteriores prácticamente

public class MyInnerClass { public static void main(String args[]) throws InterruptedException { // direct access to inner class method new MyInnerClass.StaticInnerClass().staticInnerClassMethod(); // static inner class reference object StaticInnerClass staticInnerclass = new StaticInnerClass(); staticInnerclass.staticInnerClassMethod(); // access local inner class LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass(); localInnerClass.localInnerClassMethod(); /* * Pay attention to the opening curly braces and the fact that there''s a * semicolon at the very end, once the anonymous class is created: */ /* AnonymousClass anonymousClass = new AnonymousClass() { // your code goes here... };*/ } // static inner class static class StaticInnerClass { public void staticInnerClassMethod() { System.out.println("Hay... from Static Inner class!"); } } // local inner class class LocalInnerClass { public void localInnerClassMethod() { System.out.println("Hay... from local Inner class!"); } } }

Espero que esto ayude a todos. Por favor refiérase para más


Has declarado a la clase Cosa como una clase interna no estática. Eso significa que debe estar asociado con una instancia de la clase Hello.

En tu código, estás intentando crear una instancia de Thing desde un contexto estático. De eso es de lo que se queja el compilador.

Hay algunas soluciones posibles. La solución a utilizar depende de lo que quiera lograr.

  • Cambiar Cosa para ser una clase anidada estática.

    static class Thing

  • Cree una instancia de Hello, luego cree una instancia de Thing.

    public static void main(String[] args) { Hello h = new Hello(); Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P }

  • Salir de la clase Hello.

Para obtener más información sobre las clases anidadas / internas: Clases anidadas (los tutoriales de Java)


Vamos a entenderlo con el siguiente ejemplo simple. Esto sucede porque es una CLASE INTERIOR NO ESTÁTICA. Deberías necesitar la instancia de la clase externa.

public class PQ { public static void main(String[] args) { // create dog object here Dog dog = new PQ().new Dog(); //OR PQ pq = new PQ(); Dog dog1 = pq.new Dog(); } abstract class Animal { abstract void checkup(); } class Dog extends Animal { @Override void checkup() { System.out.println("Dog checkup"); } } class Cat extends Animal { @Override void checkup() { System.out.println("Cat Checkup"); } } }


Thing es una clase interna con una conexión automática a una instancia de Hello . Obtiene un error de compilación porque no hay una instancia de Hello para que se adjunte. Puede solucionarlo más fácilmente cambiándolo a una clase anidada estática que no tiene conexión:

static class Thing


static class Thing hará que tu programa funcione.

Tal como está, tienes a Thing como una clase interna, que (por definición) está asociada con una instancia particular de Hello (incluso si nunca la usa o hace referencia a ella), lo que significa que es un error decir new Thing(); sin tener una instancia particular de Hello en el alcance.

Si en su lugar lo declara como una clase estática, entonces es una clase "anidada", que no necesita una instancia particular de Hello .