JavaRush /Blogue Java /Random-PT /Nível 24. Respostas às perguntas da entrevista sobre o tó...
zor07
Nível 31
Санкт-Петербург

Nível 24. Respostas às perguntas da entrevista sobre o tópico do nível

Publicado no grupo Random-PT
Nível 24. Respostas às perguntas da entrevista sobre o tema do nível - 1
  1. Para que as classes internas anônimas são compiladas?

    Classes internas anônimas são compiladas em внешнийКласс$n.class. No lugar da classe externa, portanto, está o nome da classe de enquadramento, dentro da qual a classe interna anônima é descrita. No lugar n está um número de 1 ao número de classes anônimas.

  2. É possível herdar classes internas?

    É possível herdar classes internas de outras pessoas.

    A herança de uma classe interna é um pouco mais complicada do que o normal, pois o construtor da classe interna está associado a uma referência ao objeto externo circundante. O problema é que a referência do objeto "oculto" da classe externa envolvente deve ser inicializada e não há mais um objeto envolvente padrão na classe derivada. Para indicar explicitamente o objeto externo envolvente, uma sintaxe especial é usada:

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

    Aqui a classe InheritInnerestende apenas a classe interna e não a externa. Mas quando se trata de criar um construtor, o construtor padrão fornecido não é adequado e você não pode simplesmente passar uma referência para um objeto externo. Você deve incluir uma expressão no corpo do construtor linkНаОбъемлющийКласс.super();. Ele fornecerá o elo perdido e o programa será compilado.

  3. É possível herdar classes internas anônimas?

    Ao descrever uma classe anônima, já estamos herdando de alguma classe ou implementando alguma interface. As palavras estende ou implementa não podem ser aplicadas diretamente a classes anônimas, mas ninguém o incomoda em preparar e estender antecipadamente a interface necessária, que implementaremos usando uma classe anônima. Um exemplo no código abaixo.

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

    Você não pode herdar de uma classe anônima.

  4. É possível substituir classes internas?

    Substituir a classe interna como se fosse outro método da classe externa na verdade não tem efeito:

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

    Conclusão:

    New Egg()
    Egg.Yolk()

    O construtor padrão é sintetizado automaticamente pelo compilador e chama o construtor padrão da classe base. BigEggVocê pode pensar que uma classe “substituída” deveria ser usada ao criar um objeto Yolk, mas isso não é de forma alguma o caso, como pode ser visto no resultado do programa.

    Este exemplo mostra simplesmente que quando você herda de uma classe externa, nada de especial acontece com as classes internas. As duas classes internas são entidades completamente separadas, com namespaces independentes. Em outras palavras, é impossível.

  5. Quais são as limitações das aulas locais?

    Primeiro, vamos lembrar o que é uma classe local. Esta é uma classe descrita em um bloco de código, ou seja, em termos simples – entre aspas {}. Na maioria das vezes, essas citações constituem o corpo do método. Mas eles também podem ser apenas um bloco, um bloco estático, um corpo ifde -s, loops, etc.

    A turma local é dotada de características de turmas internas, mas possui características distintivas, nomeadamente:

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

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

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION