JavaRush /Blog Java /Random-FR /Niveau 24. Réponses aux questions d'entretien sur le suje...
zor07
Niveau 31
Санкт-Петербург

Niveau 24. Réponses aux questions d'entretien sur le sujet du niveau

Publié dans le groupe Random-FR
Niveau 24. Réponses aux questions d'entretien sur le thème du niveau - 1
  1. Vers quoi les classes internes anonymes se compilent-elles ?

    Les classes internes anonymes sont compilées dans внешнийКласс$n.class. Par conséquent, à la place de la classe externe se trouve le nom de la classe de tramage, dans laquelle la classe interne anonyme est décrite. A la place n est un nombre allant de 1 au nombre de classes anonymes.

  2. Est-il possible d'hériter de classes internes ?

    Il est possible d'hériter des classes internes des autres.

    L'héritage d'une classe interne est un peu plus compliqué que d'habitude, puisque le constructeur de la classe interne est associé à une référence à l'objet externe environnant. Le problème est que la référence d'objet "cachée" de la classe externe englobante doit être initialisée et qu'il n'y a plus d'objet englobant par défaut dans la classe dérivée. Pour indiquer explicitement l'objet externe englobant, une syntaxe spéciale est utilisée :

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

    Ici, la classe InheritInnerétend uniquement la classe interne et non la classe externe. Mais lorsqu’il s’agit de créer un constructeur, le constructeur par défaut fourni n’est pas adapté et on ne peut pas simplement passer une référence à un objet externe. Vous devez inclure une expression dans le corps du constructeur linkНаОбъемлющийКласс.super();. Il fournira le lien manquant et le programme se compilera.

  3. Est-il possible d'hériter de classes internes anonymes ?

    En décrivant une classe anonyme, nous héritons déjà d'une classe ou implémentons une interface. Les mots extends ou Implements ne peuvent pas être directement appliqués aux classes anonymes, mais personne ne vous dérange de préparer et d'étendre à l'avance l'interface requise, que nous implémenterons à l'aide d'une classe anonyme. Un exemple dans le code ci-dessous.

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

    Vous ne pouvez pas hériter d'une classe anonyme.

  4. Est-il possible de remplacer les classes internes ?

    Remplacer la classe interne comme s'il s'agissait d'une autre méthode de la classe externe n'a en réalité aucun effet :

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

    Conclusion:

    New Egg()
    Egg.Yolk()

    Le constructeur par défaut est automatiquement synthétisé par le compilateur et appelle le constructeur par défaut de la classe de base. Vous pourriez penser que lors de la création d'un objet, BigEggil faut utiliser une classe « surchargée » Yolk, mais ce n'est en aucun cas le cas, comme le montre le résultat du programme.

    Cet exemple montre simplement que lorsque vous héritez d'une classe externe, rien de spécial n'arrive aux classes internes. Les deux classes internes sont des entités complètement distinctes, avec des espaces de noms indépendants. En d’autres termes, c’est impossible.

  5. Quelles sont les limites des cours locaux ?

    Tout d’abord, rappelons ce qu’est une classe locale. Il s'agit d'une classe décrite dans un bloc de code, c'est-à-dire en termes simples - entre guillemets {}. Le plus souvent, ces citations constituent le corps de la méthode. Mais ils peuvent aussi être simplement un bloc, un bloc statique, un corps ifde -s, des boucles, etc.

    La classe locale est dotée des caractéristiques des classes internes, mais présente des particularités, à savoir :

    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. Сколько у класса максимально может быть внутренних классов?

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

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