Для того, чтобы получить доступ к вашему demo12
внутреннему классу от demo2
класса, demo2
класса должен расширить demo1
. Более того, внутренние классы связаны с экземплярами класса, поэтому вы не можете называть его непосредственно из статического метода.
Проверьте разницу между inner and nested classes.
Статические Вложенные Классы
Как и с методами и переменными класса, статический вложенный класс связан с его внешним классом. И как статические методы класса, статический вложенный класс не может ссылаться непосредственно на переменные экземпляра или методы , определенные в его классе-оболочке: он может использовать их только через ссылку на объект.
Внутренние классы
Как с методами экземпляра и переменными, внутренний класс связан с экземпляром его заключающего класса и имеет прямой доступ к методам и полям этого объекта. Кроме того, поскольку внутренний класс равен , связанный с экземпляром, он не может определить какие-либо статические элементы .
Отредактировано:
Я хотел бы предложить, чтобы проверить дизайн ли иерархия классов не может быть упрощенным это. Особое внимание уделяется различию между внутренними и статическими вложенными классами.
Ваш внутренний класс demo12
также отмечен как защищенный, вы можете его расширить. Проверьте этот взлом:
package p2;
import p1.demo1;
public class demo2 extends demo1 {
protected int foo(int a, int b) {
return (new demo22()).fun2(a, b);
}
protected class demo22 extends demo12 {
protected int fun2(int a, int b) {
return super.fun2(a, b);
}
}
public static void main(String[] args) {
(new demo2()).foo(2, 3);
}
}
Как это косвенно? Можешь сказать мне ? Я попытался, но я могу получить доступ только к защищенному классу, а не к методу. – Poojan
У меня есть расширенный ответ. –
Вы просто создаете тот же метод в demo22. Я понимаю ваш хак. Но может ли другой способ получить доступ к fun2 без создания такого же метода в классе demo22? Спасибо за этот .... @ Maciej Lach – Poojan