Max_Cohen
@Max_Cohen
Программист, который не программирует

Что не так? Почему не компилируется?

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
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
Главная причина - "Non-ASCII character in an identifier".
У вас классы называются русскими буквами "А" и "В", а в методе main потом используются английские "A" и "B".
Мой совет на будущее, чтобы этого избежать, используйте 100% английскую раскладку - даже для того чтобы писать комментарии.

Насчет "static class А": если класс static - он уже инстанцирован при запуске, new A() сделать не получится.
"B.this.s" - выглядит довольно странно.

Итого, для того чтобы заработало, нужно:
1. Все классы назвать одинаково (одинаковыми символами в одинаковой раскладке)
2. Убрать два раза "static" для классов A и AB
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽