JavaRush /Блоги Java /Random-TG /Сатҳи 24. Ҷавобҳо ба саволҳои мусоҳиба дар мавзӯи сатҳ
zor07
Сатҳи
Санкт-Петербург

Сатҳи 24. Ҷавобҳо ба саволҳои мусоҳиба дар мавзӯи сатҳ

Дар гурӯҳ нашр шудааст
Сатҳи 24. Ҷавобҳо ба саволҳои мусоҳиба дар мавзӯи сатҳ - 1
  1. Синфҳои дохorи номаълум барои чӣ тартиб медиҳанд?

    Синфҳои дохorи беном ба внешнийКласс$n.class. Ба ҷои синфи берунӣ, мувофиқан, номи синфи чаҳорчӯба, ки дар дохor он синфи дохorи беном тавсиф мешавад. Дар ҷои 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танҳо синфи дохorро васеъ мекунад, на синфи беруниро. Аммо вақте ки сухан дар бораи сохтани конструктор меравад, конструктори пешфарз мувофиқ нест ва шумо наметавонед танҳо истинодро ба an objectи беруна интиқол диҳед. Шумо бояд ифодаро дар бадани созанда дохил кунед linkНаОбъемлющийКласс.super();. Он пайванди гумшударо таъмин мекунад ва барнома тартиб медиҳад.

  3. Оё ба мерос гирифтани синфҳои дохorи беном имконпазир аст?

    Бо тавсифи синфи беном, мо аллакай аз ягон синф мерос мегирем ё ягон интерфейсро амалӣ мекунем. Калимаҳои васеъ ё амалӣ наметавон мустақиман ба синфҳои беном истифода шаванд, аммо ҳеҷ кас шуморо ташвиш намедиҳад, ки пешакӣ омода кунед ва интерфейси заруриро васеъ кунед, ки мо онро бо истифода аз синфи беном амалӣ хоҳем кард. Намунае дар codeи зер.

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

    Шумо наметавонед аз синфи номаълум мерос гиред.

  4. Оё мумкин аст, ки синфҳои дохorро бекор кунед?

    Бартараф кардани синфи дарунӣ, ки гӯё он усули дигари синфи берунӣ бошад, воқеан таъсире надорад:

    //: 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()

    Созандаи пешфарз аз ҷониби компилятор ба таври худкор синтез карда мешавад ва конструктори пешфарзро аз синфи асосӣ даъват мекунад. Шояд шумо фикр кунед, ки ҳангоми сохтани an object BigEggбояд синфи "аз нав таъиншуда" истифода шавад Yolk, аммо ин ҳеҷ гоҳ чунин нест, зеро аз натиҷаи барнома дида мешавад.

    Ин мисол танҳо нишон медиҳад, ки ҳангоми мерос аз синфи беруна, ҳеҷ чизи махсус ба синфҳои дохилӣ рӯй намедиҳад. Ду синфи дохилӣ субъектҳои комилан ҷудогона бо фазоҳои номҳои мустақил мебошанд. Ба ибораи дигар, имконнопазир аст.

  5. Маҳдудиятҳои синфҳои маҳаллӣ чист?

    Вначале вспомним что такое локальный класс. Это класс, описанный в code block, то есть, по-простому — между кавычек {}. Наиболее часто эти кавычки являются телом метода. Но могут они быть и просто блоком, статическим блоком, телом if-ов, циклов и т.д.

    Локальный класс наделён особенностями внутренних классов, но имеет отличительные черты, а именно:

    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