JavaRush /Java 博客 /Random-ZH /第 24 级。有关该级别主题的面试问题的答案
zor07
第 31 级
Санкт-Петербург

第 24 级。有关该级别主题的面试问题的答案

已在 Random-ZH 群组中发布
第 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. 是否可以继承匿名内部类?

    通过描述匿名类,我们已经继承了某个类或实现了某个接口。extends或implements这些词不能直接应用于匿名类,但是没有人打扰你提前准备并扩展所需的接口,我们将使用匿名类来实现该接口。下面的代码中的一个示例。

    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