JavaRush /Java Blog /Random-KO /레벨 24. 레벨 주제에 대한 인터뷰 질문에 대한 답변
zor07
레벨 31
Санкт-Петербург

레벨 24. 레벨 주제에 대한 인터뷰 질문에 대한 답변

Random-KO 그룹에 게시되었습니다
레벨 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그러나 이는 단순한 블록, 정적 블록, -s 본체, 루프 등일 수도 있습니다.

    로컬 클래스에는 내부 클래스의 기능이 부여되지만 다음과 같은 독특한 기능이 있습니다.

    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