4.7 Внутренний класс
Возможно, также определять класс в пределах другого класса; такие классы известны как вложенные Классы. Возможности вложенного класса ограничены возможностями его класса приложения. Таким образом, если класс В определен в пределах класса А, то В известен А, но не вне А. Вложенный класс имеет доступ к членам, включая членов с модификатором private, из класса, в который он вложен. Однако главный класс не имеет доступа к членам вложенного класса.
4.7.1 Определение внутреннего класса
Самый важный тип вложенного класса - внутренний класс. Внутренний класс -нестатический вложенный класс. Класс, определенный в классе называют внутренним классом. Класс вне внутреннего класса называют внешним классом. Внутренний класс имеет доступ ко всем переменным и методам своего внешнего класса и может обратиться к ним непосредственно тем же самым способом, которым делают это другие нестатические члены внешнего класса. Таким образом, внутренний класс лежит полностью в пределах своего внешнего класса.
Следующая программа демонстрирует, как создаётся и используется внутренний класс.
Пример 13:
class OuterClass
String str;
boolean outerClassAccessible;
public OuterClass()
{
str = new String( OuterClass variable );
outerClassAccessible = true;
System.out.println(str);
System.out.println( outerClassAccessible : +outerClassAccessible);
System.out.println( innerClassAccessible : +innerClassAccessible);
}
class InnerClass
{
String str;
boolean innerClassAccessible;
public InnerClass(){
str = new String( InnerClass variable );
innerClassAccessible = true;
System.out.println(str);
System.out.println("innerClassAccessible + mnerClassAccessible) ;
}
}
}
class InnerClassDemo
{
public static void main(String args[])
{
OuterClass out = new OuterClass();
}
}
Вышеупомянутая программа не будет компилироваться, потому что внутренний класс не доступен из внешнего класса. Вот результат компиляции
Рисунок 4.8: Вывод
Чтобы обращаться к внутреннему классу из внешнего класса, мы должны создать объект внутреннего класса во внешнем классе.
Измененная программа, чтобы обратиться к переменным innerclass (Внутренний класс), следующая:
Пример 14:
class OuterClass
{
String str;
boolean outerClassAccessible;
InnerClass in;
public OuterClass ()
{
str = new String( OuterClass variable );
outerClassAccessible = true;
OuterClass.InnerClass in = new OuterClass.InnerClass();
System.out.println(str);
System.out.println( outerClassAccessible : +outerClassAccessible);
System.out.println( innerClassAccessible : +in.innerClassAccessible);
}
class InnerClass
{
String str;
boolean innerClassAccessible;
public InnerClass(){
str = new String( InnerClass variable );
innerClassAccessible = true;
System.out.println(str);
System.out.println( innerClassAccessible : +innerClassAccessible);
}
}
}
class InnerClassDemo
{
public static void main(String args [])
{
OuterClass out = new OuterClass();
}
}
Вывод вышеупомянутой программы:
Рисунок 4.9: Вывод
В вышеупомянутой программе, внутренний класс может быть обработан как отдельный класс, потому что, не имея объекта внутреннего класса, мы не можем обратиться к переменным и методам внутреннего класса из внешнего класса.
Обратите внимание: Процедура для объявления внутреннего класса отлична от объявления нормального класса. Чтобы объявить внутренний класс, мы должны использовать внешнее название класса, сопровождаемое точкой (.) и далее внутренним названием класса.
4.7.2 Зачем нужно использовать внутренний класс?
Преимущество наличия внутреннего класса состоит в том, что мы можем обратиться к внешним переменным класса и методам из внутреннего класса, не создавая объект внешнего класса. Следовательно, даже, отделяя класс в форме внутреннего класса, внешний класс доступен из внутреннего класса. Внутренние переменные класса или методы, имеющие то же самое имя, что и внешний класс, получают старшинство по внешним переменным класса и методам.