JavaRush /Java блогу /Random-KY /24-деңгээл. Деңгээлдеги тема боюнча интервью суроолоруна ...
zor07
Деңгээл
Санкт-Петербург

24-деңгээл. Деңгээлдеги тема боюнча интервью суроолоруна жооптор

Группада жарыяланган
24-деңгээл. Деңгээлдин темасы боюнча интервью суроолоруна жооптор - 1
  1. Анонимдүү ички класстар эмнени түзөт?

    Анонимдүү ички класстар түзүлөт внешнийКласс$n.class. Тышкы класстын ордуна, тиешелүүлүгүнө жараша, анонимдүү ички класс сүрөттөлгөн фреймдүү класстын аталышы. n ордунда 1ден анонимдүү класстардын санына чейинки сан.

  2. Ички класстарды мурастоо мүмкүнбү?

    Башкалардан ички класстарды мурастоого болот.

    Ички класстан мурастоо адаттагыдан бир аз татаалыраак, анткени ички класстын конструктору курчап турган тышкы an objectке шилтеме менен байланышкан. Маселе, курчап турган тышкы класстын "жашыруун" an objectинин шилтемеси инициализацияланышы керек жана туунду класста мындан ары демейки курчоочу an object жок. Тышкы an objectти ачык көрсөтүү үчүн атайын синтаксис колдонулат:

    //: innerclasses/InheritInner.java
    // Наследование от внутреннего класса.
    
    class WithInner {
      class Inner {}
    }
    
    public class InheritInner extends WithInner.Inner {
      //! InheritInner() {} // He компorруется
      InheritInner(WithInner wi) {
        wi.super();
      }
      public static void main(String[] args) {
        WithInner wi = new WithInner();
        InheritInner ii = new InheritInner(wi);
      }
    }

    Бул жерде класс InheritInnerсырткы классты эмес, ички классты гана кеңейтет. Бирок конструкторду түзүүгө келгенде, берилген демейки конструктор ылайыктуу эмес жана сиз жөн гана тышкы an objectке шилтеме бере албайсыз. Сиз конструктордун корпусуна туюнтманы камтышыңыз керек linkНаОбъемлющийКласс.super();. Ал жетишпеген шилтемени берет жана программа түзүлөт.

  3. Анонимдүү ички класстарды мурастоо мүмкүнбү?

    Анонимдүү классты сүрөттөө менен биз кандайдыр бир класстан мурастап жатабыз же кандайдыр бир интерфейсти ишке ашырып жатабыз. Extens же implements деген сөздөрдү түздөн-түз анонимдүү класстарга колдонууга болбойт, бирок алдын ала даярдануу жана талап кылынган интерфейсти кеңейтүү үчүн эч ким сизди убара кылbyte, биз анонимдүү класстын жардамы менен ишке ашырабыз. Төмөндөгү codeдогу мисал.

    import java.awt.event.WindowListener;
    
    public class TestExtendAnonym {
        private interface MyInterface extends Runnable, WindowListener {
        }
    
        Runnable r = new MyInterface() {
        ...
        //Пример того How реализовать 2 и более интерфейса в анонимном классе
        };
    }

    Сиз анонимдүү класстан мурастай албайсыз.

  4. Ички класстарды жокко чыгаруу мүмкүнбү?

    Ички классты сырткы класстын башка ыкмасы сыяктуу жокко чыгаруу чындыгында эч кандай натыйжа бербейт:

    //: innerclasses/BigEgg.java
    // Внутренний класс нельзя переопределить
    // подобно обычному методу,
    import static net.mindview.util.Print.*;
    
    class Egg {
      private Yolk y;
      protected class Yolk {
        public Yolk() { print("Egg.Yolk()"); }
      }
      public Egg() {
        print("New Egg()");
        y = new Yolk();
      }
    }
    
    public class BigEgg extends Egg {
      public class Yolk {
        public Yolk() { print("BigEgg.Yolk()"); }
      }
      public static void main(String[] args) {
        new BigEgg();
      }
    }

    Жыйынтык:

    New Egg()
    Egg.Yolk()

    Демейки конструктор компилятор тарабынан автоматтык түрдө синтезделет жана базалык класстан демейки конструкторду чакырат. Объектти түзүүдө BigEgg"өткөрүлгөн" класс колдонулушу керек деп ойлошуңуз мүмкүн Yolk, бирок бул программанын жыйынтыгынан көрүнүп тургандай, андай эмес.

    Бул мисал сырткы класстан тукум кууп өткөндө, ички класстарга өзгөчө эч нерсе болбогонун көрсөтүп турат. Эки ички класстар көз карандысыз аттар мейкиндиктери менен толугу менен өзүнчө an objectтер. Башкача айтканда, бул мүмкүн эмес.

  5. Жергorктүү класстардын чектөөлөрү кандай?

    Биринчиден, жергorктүү класс деген эмне экенин эстеп көрөлү. Бул code блогунда сүрөттөлгөн класс, башкача айтканда, жөнөкөй тил менен айтканда - тырмакчалардын ортосунда {}. Көбүнчө бул цитаталар методдун негизги бөлүгү болуп саналат. Бирок алар жөн гана блок, статикалык блок, if-s корпусу, циклдер ж.б.

    Жергorктүү класс ички класстардын өзгөчөлүктөрү менен жабдылган, бирок айырмалоочу өзгөчөлүктөргө ээ, атап айтканда:

    1. он имеет доступ только к финальным полям и аргументам обрамляющего метода, а также ко всем полям обрамляющего класса, в том числе приватным и статическим;
    2. локальный класс виден и может создаваться только в блоке, в котором описан;
    3. у локального класса не ставится модификатор доступа;
    4. не может иметь статических полей, методов, классов (за исключением финальных);
    5. локальный класс, объявленный в статическом блоке может обращаться только к статическим полям внешнего класса.

    Но! Начиная с Java8 мы можем обращаться в локальных классах к не финальным локальным переменным, если они не были изменены до момента инициализации класса. Также теперь стало возможным обращение к не финальным параметрам метода.

  6. Может ли анонимный внутренний класс содержать статические методы?

    Нет. У Анонимных внутренних классов, How и у внутренних классов не может быть статических полей, методов. (вспомним, что анонимные классы компorруются в обычные внутренние, а те, в свою очередь, связаны с an objectом обрамляющего класса)

  7. Можно ли создать an object внутреннего класса, если у внешнего класса только private конструктор?

    Имея подобный code:

    public class PrivateConst {
        private PrivateConst() {}
        public class InnerClass{
            public void f(){
                System.out.println("hello");
            }
       }
    }

    Напрямую, в другом классе (вне обрамляющего), конечно, создать an object InnerClass следующим способом не получится:

    PrivateConst.InnerClass priv = new PrivateConst().new InnerClass();

    Но! What если у нас есть метод, возвращающий экземпляр

    PrivateConst:public class PrivateConst {
        private static PrivateConst instance;
        private PrivateConst() {}
    
        public static PrivateConst getInstance(){
            instance = new PrivateConst();
            return instance;
        }
    
        public class InnerClass{}
    }

    В этом случае приватный конструктор нам не помеха для создания an object InnerClass. Так же мы без проблем сможем создавать его в методах и в других внутренних классах, принадлежащих PrivateConst. Ответ — можно, если Howим-либо способом нам удастся получить an object обрамляющего класса.

  8. Можно ли объявлять внутренние классы private?

    Да, можно.

    PS Обоснования так и не нашел, но на философии java встречались подобные примеры. Плюс IDE не ругается. Буду признателен за обоснование, но предположу, что в этом плане внутренний класс ничем не отличается от обычного класса.

  9. Можно ли объявлять анонимные внутренние классы private?

    Аналогично (в плане не нашел обоснования). Можно объявить private переменную от типа которой наследуется наш анонимный класс.

  10. Сколько у класса максимально может быть внутренних классов?

    Сколь угодно много. Ограничение особенности ОС и длинны имени файлов.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION