class Nested {
static private int pr; // Переменная pr объявленa статической
// чтобы к ней был доступ из статических классов А и АВ
String s = "Member of Nested";
// Вкладываем статический класс.
static class А { // Полное имя этого класса - Nested.A
private int a = pr;
String s = "Member of A";
// Во вложенный класс А вкладываем еще один статический класс
static class AB { // Полное имя класса - Nested.А.АВ
private int ab = pr;
String s = "Member of AB";
}
}
//В класс Nested вкладываем нестатический класс
class В { // Полное имя этого класса - Nested.В
private int b = pr;
String s = "Member of B";
// В класс В вкладываем еще один класс
class ВС { // Полное имя класса - Nested.В.ВС
private int bc = pr;
String s = "Member of ВС";
}
void f(final int i) { // Без слова final переменные i и j
final int j = 99; // нельзя использовать в локальном классе D
class D { // Локальный класс D известен только внутри f()
private int d = pr;
String s = "Member of D";
void pr() {
// Обратите внимание на то, как различаются
// переменные с одним и тем же именем "s"
System.out.println(s + (i + j)); // "s" эквивалентно "this.s"
System.out.println(B.this.s);
System.out.println(Nested.this.s);
// System.out.println(AB.this.s); // Нет доступа
// System.out.println(A.this.s); // Нет доступа
}
}
D d = new D(); // Объект определяется тут же, в методе f()
d.pr(); // Объект известен только в методе f()
}
}
void m() {
new Object() { // Создается объект безымянного класса,
// указывается конструктор его суперкласса
private int e = pr;
void go() {
System.out.println("From g()");
}
}.go(); // Тут же выполняется метод только что созданного объекта
}
}
public class NestedClasses {
public static void main(String[] args) {
Nested nest = new Nested(); // Последовательно раскрываются
// три матрешки
Nested.A theA = nest.new A(); // Полное имя класса и уточненная
// операция new. Но конструктор только вложенного класса
Nested.A.AB theAB = theA.new AB(); // Те же правила. Операция
// new уточняется только одним именем
Nested.В theB = nest.new B(); // Еще одна матрешка
Nested.В.ВС theBC = theB.new BC();
theB.f(999); // Методы вызываются обычным образом
nest.m();
}
}
Ошибка такая, Я сам не могу понять.
NestedClasses.java:33: error: cannot find symbol
System.out.println(B.this.s);
^
symbol: class B
location: class D
NestedClasses.java:57: error: cannot find symbol
Nested.A theA = nest.new A(); // Полное имя класса и уточненная
^
symbol: class A
location: class Nested
NestedClasses.java:57: error: cannot find symbol
Nested.A theA = nest.new A(); // Полное имя класса и уточненная
^
symbol: class A
location: class Nested
NestedClasses.java:59: error: cannot find symbol
Nested.A.AB theAB = theA.new AB(); // Те же правила. Операция
^
symbol: class A
location: class Nested
NestedClasses.java:61: error: cannot find symbol
Nested.В theB = nest.new B(); // Еще одна матрешка
^
symbol: class B
location: class Nested
NestedClasses.java:62: error: cannot find symbol
Nested.В.ВС theBC = theB.new BC();
^
symbol: class BC
location: class Nested.В
6 errors