JavaRush /مدونة جافا /Random-AR /المستوى 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. هل من الممكن أن ترث الطبقات الداخلية المجهولة؟

    من خلال وصف فئة مجهولة، فإننا نرث بالفعل من فئة ما أو ننفذ واجهة ما. الكلمات يمتد أو ينفذ لا يمكن تطبيقها مباشرة على الفئات المجهولة، ولكن لا أحد يزعجك بالتحضير المسبق وتوسيع الواجهة المطلوبة، والتي سننفذها باستخدام فئة مجهولة. مثال في الكود أدناه.

    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. ما هي القيود المفروضة على الطبقات المحلية؟

    أولا، دعونا نتذكر ما هو الفصل المحلي. هذه فئة موصوفة في كتلة من التعليمات البرمجية، أي بعبارات بسيطة - بين علامتي الاقتباس {}. غالبًا ما تكون هذه الاقتباسات هي نص الطريقة. ولكن من الممكن أيضًا أن تكون مجرد كتلة، أو كتلة ثابتة، أو مجموعة 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