Java – Nessuna istanza di inclusione di tipo Foo è accessibile

Ho il codice seguente:

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!"); } } 

So che Thing non fa nulla, ma il mio programma Hello, World non ha successo. Sono solo le mie classi definite che mi stanno fallendo.

E si rifiuta di compilare. Prendo No enclosing instance of type Hello is accessible." Alla linea che crea una nuova Cosa. Sto indovinando sia:

  1. Ho problemi a livello di sistema (in DrJava o nella mia installazione Java) o
  2. Ho alcune incomprensioni fondamentali su come build un programma di lavoro in java.

Qualche idea?

static class Thing farà funzionare il tuo programma.

Così com’è, tu hai Thing come una class interiore, che (per definizione) è associata ad una particolare istanza di Hello (anche se non la usa mai o fa riferimento ad essa), il che significa che è un errore dire new Thing(); senza avere una particolare istanza Hello in ambito.

Se invece lo dichiari come una class statica, allora è una class “annidata”, che non ha bisogno di una particolare istanza Hello .

Hai dichiarato la class Thing come una class interiore non statica. Ciò significa che deve essere associato a un’istanza della class Hello.

Nel tuo codice, stai provando a creare un’istanza di Thing da un contesto statico. Questo è ciò di cui si lamenta il compilatore.

Ci sono alcune possibili soluzioni. Quale soluzione utilizzare dipende da ciò che si vuole raggiungere.

  • Modifica cosa per essere una class nidificata statica.

     static class Thing 
  • Crea un’istanza di Hello, quindi crea un’istanza di 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 } 
  • Sposta la cosa fuori dalla class Hello.

Per ulteriori informazioni sulle classi nidificate / interne: Classi nidificate (The Java Tutorials)

Bene … tante buone risposte ma voglio aggiungerne altre. Un breve sguardo sulla class interna in Java-Java ci consente di definire una class all’interno di un’altra class e la possibilità di nidificare le classi in questo modo presenta alcuni vantaggi:

  1. Può hide (aumenta l’incapsulamento) la class da altre classi, specialmente se la class viene utilizzata solo dalla class in cui è contenuta. In questo caso non è necessario che il mondo esterno ne sia a conoscenza.

  2. Può rendere il codice più gestibile in quanto le classi sono raggruppate logicamente attorno a dove sono necessarie.

  3. La class interna ha accesso alle variabili di istanza e ai metodi della sua class contenente.

Abbiamo principalmente tre tipi di Inner Classes

  1. Locale interno
  2. Classe interna statica
  3. Classe interiore anonima

Alcuni dei punti importanti da ricordare

  • Abbiamo bisogno di un object di class per accedere alla Local Inner Class in cui esiste.
  • Static Inner Class ottiene direttamente l’accesso come qualsiasi altro metodo statico della stessa class in cui è presente.
  • La class interna anonima non è visibile al mondo esterno e agli altri metodi o classi della stessa class (in cui esiste) e viene utilizzata nel punto in cui è dichiarata.

Cerchiamo di vedere i concetti di cui sopra in pratica_

 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!"); } } } 

Spero che questo possa aiutare tutti. Si prega di fare riferimento per più

Lo capiamo con il seguente semplice esempio. Questo succede perché questa è una CLASSE INTERNA NON STATICA. Dovresti aver bisogno dell’istanza della class esterna.

  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 è una class interiore con una connessione automatica a un’istanza di Hello . Si ottiene un errore di compilazione perché non esiste alcuna istanza di Hello a cui albind. Puoi sistemarlo più facilmente cambiandolo in una class nidificata statica che non ha alcuna connessione:

 static class Thing