JavaRush /Java-Blog /Random-DE /Level 24. Antworten auf Interviewfragen zum Levelthema
zor07
Level 31
Санкт-Петербург

Level 24. Antworten auf Interviewfragen zum Levelthema

Veröffentlicht in der Gruppe Random-DE
Level 24. Antworten auf Interviewfragen zum Thema Level - 1
  1. Wozu kompilieren anonyme innere Klassen?

    Anonyme innere Klassen werden in kompiliert внешнийКласс$n.class. Anstelle der äußeren Klasse steht dementsprechend der Name der Rahmenklasse, innerhalb derer die anonyme innere Klasse beschrieben wird. Anstelle ist n eine Zahl von 1 bis zur Anzahl der anonymen Klassen.

  2. Ist es möglich, innere Klassen zu erben?

    Es ist möglich, innere Klassen von anderen zu erben.

    Die Vererbung von einer inneren Klasse ist etwas komplizierter als üblich, da der Konstruktor der inneren Klasse mit einer Referenz auf das umgebende äußere Objekt verknüpft ist. Das Problem besteht darin, dass die „versteckte“ Objektreferenz der umschließenden äußeren Klasse initialisiert werden muss und es in der abgeleiteten Klasse kein standardmäßiges umschließendes Objekt mehr gibt. Um das umschließende externe Objekt explizit anzugeben, wird eine spezielle Syntax verwendet:

    //: innerclasses/InheritInner.java
    // Наследование от внутреннего класса.
    
    class WithInner {
      class Inner {}
    }
    
    public class InheritInner extends WithInner.Inner {
      //! InheritInner() {} // He компoderруется
      InheritInner(WithInner wi) {
        wi.super();
      }
      public static void main(String[] args) {
        WithInner wi = new WithInner();
        InheritInner ii = new InheritInner(wi);
      }
    }

    Hier erweitert die Klasse InheritInnernur die innere Klasse und nicht die äußere. Wenn es jedoch darum geht, einen Konstruktor zu erstellen, ist der bereitgestellte Standardkonstruktor nicht geeignet und Sie können nicht einfach eine Referenz auf ein externes Objekt übergeben. Sie müssen einen Ausdruck in den Hauptteil des Konstruktors einfügen VerknüpfungНаОбъемлющийКласс.super();. Es stellt den fehlenden Link bereit und das Programm wird kompiliert.

  3. Ist es möglich, anonyme innere Klassen zu erben?

    Indem wir eine anonyme Klasse beschreiben, erben wir bereits von einer Klasse oder implementieren eine Schnittstelle. Die Wörter „extend“ oder „implementiert“ können nicht direkt auf anonyme Klassen angewendet werden, aber niemand stört Sie, die erforderliche Schnittstelle im Voraus vorzubereiten und zu erweitern, die wir mithilfe einer anonymen Klasse implementieren. Ein Beispiel im Code unten.

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

    Sie können nicht von einer anonymen Klasse erben.

  4. Ist es möglich, innere Klassen zu überschreiben?

    Das Überschreiben der inneren Klasse, als wäre es eine andere Methode der äußeren Klasse, hat tatsächlich keine Auswirkung:

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

    Abschluss:

    New Egg()
    Egg.Yolk()

    Der Standardkonstruktor wird vom Compiler automatisch synthetisiert und ruft den Standardkonstruktor aus der Basisklasse auf. Man könnte meinen, dass beim Erstellen eines Objekts BigEggeine „überschriebene“ Klasse verwendet werden sollte Yolk, aber das ist keineswegs der Fall, wie aus dem Ergebnis des Programms hervorgeht.

    Dieses Beispiel zeigt einfach, dass beim Erben von einer äußeren Klasse mit den inneren Klassen nichts Besonderes passiert. Die beiden inneren Klassen sind völlig separate Einheiten mit unabhängigen Namensräumen. Mit anderen Worten: Es ist unmöglich.

  5. Welche Einschränkungen gibt es bei lokalen Klassen?

    Erinnern wir uns zunächst daran, was eine lokale Klasse ist. Dies ist eine Klasse, die in einem Codeblock beschrieben wird, also in einfachen Worten – in Anführungszeichen {}. Meistens bilden diese Zitate den Hauptteil der Methode. Sie können aber auch nur ein Block, ein statischer Block, ein Körper ifaus -s, Schleifen usw. sein.

    Die lokale Klasse ist mit den Merkmalen interner Klassen ausgestattet, weist jedoch Besonderheiten auf, nämlich:

    1. он имеет доступ только к финальным полям и аргументам обрамляющего метода, а также ко всем полям обрамляющего класса, в том числе приватным и статическим;
    2. локальный класс виден и может создаваться только в блоке, в котором описан;
    3. у локального класса не ставится модификатор доступа;
    4. не может иметь статических полей, методов, классов (за исключением финальных);
    5. локальный класс, объявленный в статическом блоке может обращаться только к статическим полям внешнего класса.

    Но! Начиная с Java8 мы можем обращаться в локальных классах к не финальным локальным переменным, если они не были изменены до момента инициализации класса. Также теперь стало возможным обращение к не финальным параметрам метода.

  6. Может ли анонимный внутренний класс содержать статические методы?

    Нет. У Анонимных внутренних классов, Wie и у внутренних классов не может быть статических полей, методов. (вспомним, что анонимные классы компoderруются в обычные внутренние, а те, в свою очередь, связаны с ein Objektом обрамляющего класса)

  7. Можно ли создать ein Objekt внутреннего класса, если у внешнего класса только private конструктор?

    Имея подобный Code:

    public class PrivateConst {
        private PrivateConst() {}
        public class InnerClass{
            public void f(){
                System.out.println("hello");
            }
       }
    }

    Напрямую, в другом классе (вне обрамляющего), конечно, создать ein Objekt InnerClass следующим способом не получится:

    PrivateConst.InnerClass priv = new PrivateConst().new InnerClass();

    Но! Was если у нас есть метод, возвращающий экземпляр

    PrivateConst:public class PrivateConst {
        private static PrivateConst instance;
        private PrivateConst() {}
    
        public static PrivateConst getInstance(){
            instance = new PrivateConst();
            return instance;
        }
    
        public class InnerClass{}
    }

    В этом случае приватный конструктор нам не помеха для создания ein Objektа InnerClass. Так же мы без проблем сможем создавать его в методах и в других внутренних классах, принадлежащих PrivateConst. Ответ — можно, если Wieим-либо способом нам удастся получить ein Objekt обрамляющего класса.

  8. Можно ли объявлять внутренние классы private?

    Да, можно.

    PS Обоснования так и не нашел, но на философии java встречались подобные примеры. Плюс IDE не ругается. Буду признателен за обоснование, но предположу, что в этом плане внутренний класс ничем не отличается от обычного класса.

  9. Можно ли объявлять анонимные внутренние классы private?

    Аналогично (в плане не нашел обоснования). Можно объявить private переменную от типа которой наследуется наш анонимный класс.

  10. Сколько у класса максимально может быть внутренних классов?

    Сколь угодно много. Ограничение особенности ОС и длинны имени файлов.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION