JavaRush /Blog Java /Random-ES /Nivel 24. Respuestas a las preguntas de la entrevista sob...
zor07
Nivel 31
Санкт-Петербург

Nivel 24. Respuestas a las preguntas de la entrevista sobre el tema del nivel.

Publicado en el grupo Random-ES
Nivel 24. Respuestas a las preguntas de la entrevista sobre el tema del nivel - 1
  1. ¿En qué se compilan las clases internas anónimas?

    Las clases internas anónimas se compilan en внешнийКласс$n.class. Por consiguiente, en lugar de la clase externa se coloca el nombre de la clase marco, dentro de la cual se describe la clase interna anónima. En lugar n es un número del 1 al número de clases anónimas.

  2. ¿Es posible heredar clases internas?

    Es posible heredar clases internas de otros.

    La herencia de una clase interna es un poco más complicada de lo habitual, ya que el constructor de la clase interna está asociado con una referencia al objeto externo circundante. El problema es que la referencia de objeto "oculta" de la clase externa adjunta debe inicializarse y ya no hay un objeto adjunto predeterminado en la clase derivada. Para indicar explícitamente el objeto externo adjunto, se utiliza una sintaxis especial:

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

    Aquí la clase InheritInnersolo extiende la clase interna y no la externa. Pero cuando se trata de crear un constructor, el constructor predeterminado proporcionado no es adecuado y no se puede simplemente pasar una referencia a un objeto externo. Debes incluir una expresión en el cuerpo del constructor enlaceНаОбъемлющийКласс.super();. Proporcionará el enlace que falta y el programa se compilará.

  3. ¿Es posible heredar clases internas anónimas?

    Al describir una clase anónima, ya estamos heredando de alguna clase o implementando alguna interfaz. Las palabras extiende o implementa no se pueden aplicar directamente a clases anónimas, pero nadie se molesta en preparar con anticipación y ampliar la interfaz requerida, que implementaremos usando una clase anónima. Un ejemplo en el código siguiente.

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

    No puedes heredar de una clase anónima.

  4. ¿Es posible anular las clases internas?

    Anular la clase interna como si fuera otro método de la clase externa en realidad no tiene ningún efecto:

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

    Conclusión:

    New Egg()
    Egg.Yolk()

    El compilador sintetiza automáticamente el constructor predeterminado y llama al constructor predeterminado desde la clase base. Se podría pensar que al crear un objeto BigEggse debería utilizar una clase "anulada" Yolk, pero este no es el caso, como se puede ver en el resultado del programa.

    Este ejemplo simplemente muestra que cuando se hereda de una clase externa, no les sucede nada especial a las clases internas. Las dos clases internas son entidades completamente separadas, con espacios de nombres independientes. En otras palabras, es imposible.

  5. ¿Cuáles son las limitaciones de las clases locales?

    Primero, recordemos qué es una clase local. Esta es una clase descrita en un bloque de código, es decir, en términos simples, entre comillas {}. En la mayoría de los casos, estas citas constituyen el cuerpo del método. Pero también pueden ser simplemente un bloque, un bloque estático, un cuerpo ifde -s, bucles, etc.

    La clase local está dotada de las características de las clases internas, pero tiene características distintivas, a saber:

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

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

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

    Нет. У Анонимных внутренних классов, Cómo и у внутренних классов не может быть статических полей, методов. (вспомним, что анонимные классы компoруются в обычные внутренние, а те, в свою очередь, связаны с un objetoом обрамляющего класса)

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

    Имея подобный código:

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

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

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

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

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

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

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

    Да, можно.

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

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

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

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

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

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