Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 61
Ильдар Шаукатович Хабибуллин
Вложенные классы
В этой главе уже несколько раз упоминалось, что в теле класса можно сделать описание другого,
□ Можем ли мы из вложенного класса обратиться к членам внешнего класса? Можем, для того это все и задумывалось.
□ А можем ли мы в таком случае определить экземпляр вложенного класса, не определяя экземпляры внешнего класса? Нет, не можем, сначала надо определить хоть один экземпляр внешнего класса, матрешка ведь!
□ А если экземпляров внешнего класса несколько, как узнать, с каким экземпляром внешнего класса работает данный экземпляр вложенного класса? Имя экземпляра вложенного класса уточняется именем связанного с ним экземпляра внешнего класса. Более того, при создании вложенного экземпляра операция new тоже уточняется именем внешнего экземпляра.
□ А?..
Хватит вопросов, давайте разберем все по порядку.
Все вложенные классы можно разделить на вложенные
Классы-члены могут быть объявлены статическими с помощью модификатора static. Поведение статических классов-членов ничем не отличается от поведения обычных классов, отличается только обращение к таким классам. Поэтому они называются
Все нестатические вложенные классы называются
Локальные классы, как и все локальные переменные, известны только в блоке, в котором они определены. Они могут быть
В листинге 2.7 рассмотрены все эти случаи.
Листинг 2.7. Вложенные классы
class Nested{
static private int pr; // Переменная pr объявлена статической,
// чтобы к ней был доступ из статических классов A и AB.
String s = "Member of Nested";
// Вкладываем статический класс.
static class A{ // Полное имя этого класса — Nested.A
private int a = pr;
String s = "Member of A";
// Во вложенный класс A вкладываем еще один статический класс. static class AB{ // Полное имя класса — Nested.A.AB
private int ab = pr;
String s = "Member of AB";
}
}
// В класс Nested вкладываем нестатический класс. class B{ // Полное имя этого класса — Nested.B
private int b = pr;
String s = "Member of B";
// В класс B вкладываем еще один класс.
class BC{ // Полное имя класса — Nested.B.BC
private int bc = pr;
String s = "Member of BC";