JavaRush /وبلاگ جاوا /Random-FA /سطح 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. آیا می توان کلاس های داخلی ناشناس را به ارث برد؟

    با توصیف یک کلاس ناشناس، ما در حال حاضر از یک کلاس به ارث می بریم یا یک رابط را پیاده سازی می کنیم. کلمات extends یا implements را نمی‌توان مستقیماً برای کلاس‌های ناشناس اعمال کرد، اما هیچ‌کس شما را اذیت نمی‌کند که از قبل آماده کنید و رابط مورد نیاز را گسترش دهید، که ما آن را با استفاده از یک کلاس ناشناس پیاده‌سازی می‌کنیم. یک مثال در کد زیر.

    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باید از یک کلاس overridden استفاده شود Yolk، اما همانطور که از نتیجه برنامه قابل مشاهده است، به هیچ وجه اینطور نیست.

    این مثال به سادگی نشان می دهد که وقتی از یک طبقه بیرونی ارث می برید، اتفاق خاصی برای کلاس های داخلی نمی افتد. دو کلاس داخلی، موجودیت‌های کاملاً مجزا با فضای نام مستقل هستند. به عبارت دیگر غیر ممکن است.

  5. محدودیت های کلاس های محلی چیست؟

    ابتدا بیایید به یاد بیاوریم که کلاس محلی چیست. این کلاسی است که در یک بلوک کد توضیح داده شده است، یعنی به زبان ساده - بین نقل قول ها {}. اغلب این نقل قول ها بدنه روش هستند. اما آنها همچنین می توانند فقط یک بلوک، یک بلوک استاتیک، بدنه ای 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