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:
- Tengo problemas a nivel del sistema (ya sea en DrJava o mi instalación de Java) o
- 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:
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.
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 los métodos de su clase contenedora.
Tenemos principalmente tres tipos de Inner Classes
- Local interno
- Clase interna estática
- 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
.