Создание экземпляра объекта внутреннего класса из текущего объекта внешнего класса - PullRequest
4 голосов
/ 22 октября 2011

Мне интересно, допустимо ли следующее в Java:

class OuterClass {

    OuterClass(param1, param2) {
        ...some initialization code...
    }

    void do {
       // Here is where the doubt lays
       OuterClass.InnerClass ic = this.new InnerClass();
    }

    class InnerClass {

    }

}

По сути, здесь я пытаюсь создать экземпляр объекта внутреннего класса из текущего экземпляра внешнего класса, а не нового экземпляра, текущего. Я считаю, что это удобно, когда конструктор внешнего класса не пустой (принимает параметры), и мы не знаем, что передать им (они не могут быть нулевыми, поскольку некоторые могут быть назначены переменной класса, к которой обращается внутренний объект класса).

Дай мне знать, хорошо ли я объяснил.

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 22 октября 2011

Относительно:

public class OuterClass {

   OuterClass() {
       // ...some initialization code...
   }

   void doSomething() {
      OuterClass.InnerClass ic = this.new InnerClass();
   }

   class InnerClass {

   }

Вам не нужен ни явный идентификатор OuterClass, ни this, как они подразумеваются.

Так что это не нужно:

OuterClass.InnerClass ic = this.new InnerClass();

И это нормально внутри метода экземпляра:

* * 1010

Вещи становятся более ясными, если вы создаете объект InnerClass в статическом методе, таком как main, который содержится внутри OuterClass. Там вам нужно быть более явным:

Это не сработает

public class OuterClass {
    public static void main(String[] args) {
       InnerClass otherInnerVar = new InnerClass(); // won't work
    }

Но это будет хорошо работать:

public class OuterClass {
    public static void main(String[] args) {
       InnerClass otherInnerVar2 = new OuterClass().new InnerClass(); // will  work
    }
3 голосов
/ 22 октября 2011

Каждый экземпляр внутреннего класса, если класс не объявлен как static, должен иметь экземпляр «подключенного» внешнего класса, чтобы его можно было создать.

Это не сработает:

public class Outer {
    public class Inner { 
    }
    public static void main(String[] args) {
        Inner inner = new Inner(); //compilation error
    }
}

Однако это будет работать, ему не нужен экземпляр Outer, поскольку используется ключевое слово static:

* * 1010

больше информации: внутренние классы Java

1 голос
/ 18 сентября 2015

Выше приведен пример создания объекта Внутренний класс внутри внешнего класса и вне внешнего класса:

public class OuterClass {

public class InnerClass{

    public void myMethod(){
        System.out.println("inside inner class");
    }
}

public void myMethod(){
    System.out.println("outer class method");
    InnerClass class1 = new InnerClass();
    class1.myMethod();
}

public static void main(String[] args){
    //OuterClass.InnerClass class1 = new OuterClass().i
    OuterClass outerClassObj = new OuterClass();
    OuterClass.InnerClass innerClassObj = outerClassObj.new InnerClass();
    innerClassObj.myMethod();
}
}
...