JavaRush /Java блогы /Random-KK /Деңгей 24. Деңгейлік тақырып бойынша сұхбат сұрақтарына ж...
zor07
Деңгей
Санкт-Петербург

Деңгей 24. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар

Топта жарияланған
24-деңгей. Деңгей тақырыбы бойынша сұхбат сұрақтарына жауаптар – 1
  1. Анонимді ішкі сыныптар нені құрастырады?

    Анонимді ішкі сыныптар құрастырылады внешнийКласс$n.class. Сыртқы сыныптың орнына, сәйкесінше, анонимді ішкі класс сипатталатын фреймдік класстың атауы. n орнында 1-ден анонимді сыныптар санына дейінгі сан.

  2. Ішкі сыныптарды мұраға алуға болады ма?

    Ішкі класстарды басқалардан мұраға алуға болады.

    Ішкі сыныптан мұра алу әдеттегіден сәл күрделірек, өйткені ішкі сыныптың конструкторы қоршаған сыртқы нысанға сілтемемен байланысты. Мәселе мынада, қоршалған сыртқы сыныптың «жасырын» нысан сілтемесі инициализациялануы керек және туынды сыныпта әдепкі қоршау нысаны енді жоқ. Қоршаған сыртқы нысанды нақты көрсету үшін арнайы синтаксис қолданылады:

    //: 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сыртқы сыныпты емес, тек ішкі сыныпты кеңейтеді. Бірақ конструкторды құруға келетін болсақ, ұсынылған әдепкі конструктор жарамсыз және сыртқы нысанға сілтеме жібере алмайсыз. Конструктордың денесіне өрнекті қосу керек linkНаОбъемлющийКласс.super();. Ол жетіспейтін сілтемені береді және бағдарлама құрастырады.

  3. Анонимді ішкі сыныптарды мұраға алуға болады ма?

    Анонимді классты сипаттай отырып, біз әлдеқашан қандай да бір сыныптан мұра аламыз немесе кейбір интерфейсті жүзеге асырып жатырмыз. Extens немесе implements сөздерін анонимді сыныптарға тікелей қолдану мүмкін емес, бірақ ешкім сізге алдын ала дайындалып, қажетті интерфейсті кеңейтуге кедергі жасамайды, біз оны анонимді класс арқылы жүзеге асырамыз. Төмендегі 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, бірақ бұл бағдарламаның нәтижесінен көрініп тұрғандай, олай емес.

    Бұл мысал сыртқы сыныптан мұра алған кезде ішкі сыныптарда ерекше ештеңе болмайтынын көрсетеді. Екі ішкі сынып тәуелсіз аттар кеңістіктері бар толығымен бөлек нысандар. Басқаша айтқанда, бұл мүмкін емес.

  5. Жергілікті сыныптардың шектеулері қандай?

    Алдымен, жергілікті сыныптың не екенін еске түсірейік. Бұл code блогында сипатталған класс, яғни қарапайым тілмен айтқанда - тырнақшалар арасында {}. Көбінесе бұл тырнақшалар әдістің негізгі бөлігі болып табылады. Бірақ олар жай ғана блок, статикалық блок, if-s денесі, циклдар және т.б. болуы мүмкін.

    Жергілікті класс ішкі сыныптардың ерекшеліктерімен жабдықталған, бірақ ерекше белгілері бар, атап айтқанда:

    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