JavaRush /בלוג Java /Random-HE /רמה 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של -ים, לולאות וכו'.

    המעמד המקומי ניחן בתכונות של כיתות פנימיות, אך יש לה מאפיינים ייחודיים, כלומר:

    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