Как я могу использовать экземпляр внутреннего класса из другого метода внутреннего класса?

StackOverflow https://stackoverflow.com/questions/1406525

  •  05-07-2019
  •  | 
  •  

Вопрос

public class Ex7 {
    private int fld;

    private void meth(int val) {
        fld = val;
        System.out.println(" meth() -> fld = " + fld);
    }

    public class Ex7Inner1 {
        void operateOnFld() {
            fld = 12;
        }

        void operateOnMeth() {
            meth(10);
        }

        public void bar() {
            System.out.println(" bar() ");
        }
    }

    class Ex7Inner2 {
        Ex7Inner1 i1 = new Ex7Inner1();
        // how to call i1.bar() ??
        i1.bar();
    }
}
Это было полезно?

Решение

Ваша проблема в том, что вам нужно позвонить i1.bar() внутри функции. Например

class Ex7Inner2 {
    Ex7Inner1 i1 = new Ex7Inner1();  // this is now a field of the Ex7Inner2 class
    public void callBar() {
        i1.bar();                    // this will work
    }
}

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

Ex7.java:26: <identifier> expected
  i1.bar();
        ^
1 error

Это потому, что единственное, что вы можете сделать за пределами метода (как вы изначально имели его), - это объявить переменные. Таким образом, он ожидал «идентификатора», под которым он означал «имя переменной, которую вы объявляете». Итак, если вы сказали

String s;

потом s был бы идентификатор.

Другие советы

Несколько вещей здесь не так;

  • Ваш Inner2 должен вызывать I1 внутри функции
  • Поскольку вы не объявили Inner1 Static, ему нужен экземпляр, когда EX7 существует.

Таким образом, вы можете сделать что-то вроде этого:

public class Ex7 {

    private Ex7Inner1 i1;
    public class Ex7Inner1 {
        public void bar() {
            System.out.println( " bar() " );
        }
    }

    class Ex7Inner2 {
        // how to call i1.bar() ??
        public Ex7Inner2() {
            Ex7.this.i1.bar();
        }
    }
}

Для доступа к I1 EX7.

Если ваш экземпляр EX7 содержит Inner1 и Inner2, и ваша ссылка из Inner2 является Inner2 -> Parentex7 -> Детский Inner1.

Если вы делаете статический класс, вы можете покончить с ссылкой EX7, поскольку вы определяете, что внутренний класс не нужен экземпляр внешнего класса для существующих.

Но в классе Ex7inner2 нет метода. Создать метод с 'i1.bar (); Позвоните внутрь, и он компилируется ОК

Ex7Inner1 нуждается в ссылке на Ex7 для того, чтобы мгновенно. От Ex7Inner2 Эта ссылка есть Ex7.this.

Таким образом, скажи

Ex7Inner1 i1 = Ex7.this.new Ex7Inner1()

Увидеть Учебник Java из дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top