Как я могу использовать экземпляр внутреннего класса из другого метода внутреннего класса?
-
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 из дополнительной информации.