Why we can not make an instance of inner class inside the main method of outer class in regular way?

久未见 提交于 2020-01-30 08:53:07

问题


I know how to make an instance of an inner class. But I want to know why we can not do that in the following way:

class outerclass{

      public static void main(String[] args){
              innerclass in=new innerclass();
      }

      class innerclass{


      }

}

If I do this then I get the following error:

No enclosing instance of type outerclass is accessible. Must qualify the allocation with an enclosing instance of type outerclass (e.g. x.new A() where x is an instance of outerclass).

Why?


回答1:


class Demo{

    public static void main(String[] args){
            System.out.println(innerclass.a);

    }

    static class innerclass{
            static int a=1;

    }


}

Gives the output 1.

See here while making the inner class as static You can easily access in your outer class,In order to create an instance of the Nested class you must reference it by prefixing it with the Outer class name, like this:

Outer.Nested instance = new Outer.Nested();

Non-static Nested Classes (Inner Classes) Non-static nested classes in Java are also called inner classes. Inner classes are associated with an instance of the enclosing class. Thus, you must first create an instance of the enclosing class to create an instance of an inner class. Here is an example inner class definition:

public class Outer {

  public class Inner {
  }

}

Here is how you create an instance of the Inner class:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

Notice how you put new after the reference to the outer class in order to create an instance of the inner class.

Non-static nested classes (inner classes) have access to the fields of the enclosing class, even if they are declared private. Here is an example of that:

public class Outer {

    private String text = "I am private!";

    public class Inner {

        public void printText() {
            System.out.println(text);
        }
    }
}



回答2:


Your innerclass is not static. This means it must have a reference to the outerclass. main is static and has no implicit outerclass.

The simple solution is to make your inner class a static nested class.




回答3:


You must either make your inner class static (as already mentioned) or create your inner class from a non-static context, e.g. from a non-static method.

I.e. either this:

class outerclass{
  void myMethod() {
      innerclass in = new innerclass();
  }
  class innerclass{
  }
}

or this

class outerclass{
      public static void main(String[] args){
           innerclass in=new innerclass();
      }
      static class innerclass{
      }
}



回答4:


outerclass thats encapsulates innerclass is not instantiated, hence, calling innerclass directly would throw an error since there is no outerclass to attach innerclass.

Therefore as suggested by the previous answers, making innerclass static would resolve the problem, allowing access to the innerclass without instantiation.

There are lot of existing answers with regards to this topic. A quick google brings this up.

Java - No enclosing instance of type Foo is accessible



来源:https://stackoverflow.com/questions/39328107/why-we-can-not-make-an-instance-of-inner-class-inside-the-main-method-of-outer-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!