-
匿名内部类编译成什么?
匿名内部类被编译成
внешнийКласс$n.class
. 因此,代替外部类的是框架类的名称,其中描述了匿名内部类。n 是一个从 1 到匿名类数量的数字。 -
内部类可以继承吗?
可以从其他类继承内部类。
从内部类继承比平常稍微复杂一些,因为内部类的构造函数与周围外部对象的引用相关联。问题是必须初始化封闭外部类的“隐藏”对象引用,并且派生类中不再有默认的封闭对象。为了显式指示封闭的外部对象,使用了特殊的语法:
//: 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();
。它将提供缺失的链接并且程序将编译。 -
是否可以继承匿名内部类?
通过描述匿名类,我们已经继承了某个类或实现了某个接口。extends或implements这些词不能直接应用于匿名类,但是没有人打扰你提前准备并扩展所需的接口,我们将使用匿名类来实现该接口。下面的代码中的一个示例。
import java.awt.event.WindowListener; public class TestExtendAnonym { private interface MyInterface extends Runnable, WindowListener { } Runnable r = new MyInterface() { ... //Пример того How реализовать 2 и более интерфейса в анонимном классе }; }
您不能从匿名类继承。
-
是否可以重写内部类?
重写内部类就像它是外部类的另一个方法一样实际上没有任何效果:
//: 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
,但事实并非如此,从程序的结果可以看出。这个例子只是表明,当您从外部类继承时,内部类不会发生任何特殊情况。两个内部类是完全独立的实体,具有独立的命名空间。换句话说,这是不可能的。
-
本地课程有哪些限制?
首先,让我们记住什么是本地类。这是一个用代码块描述的类,简单来说就是 - 在引号之间
{}
。大多数情况下,这些引用是方法的主体。但它们也可以只是一个块、静态块、if
-s 体、循环等。本地类赋予了内部类的特征,但又具有鲜明的特点,即:
- он имеет доступ только к финальным полям и аргументам обрамляющего метода, а также ко всем полям обрамляющего класса, в том числе приватным и статическим;
- локальный класс виден и может создаваться только в блоке, в котором описан;
- у локального класса не ставится модификатор доступа;
- не может иметь статических полей, методов, классов (за исключением финальных);
- локальный класс, объявленный в статическом блоке может обращаться только к статическим полям внешнего класса.
Но! Начиная с Java8 мы можем обращаться в локальных классах к не финальным локальным переменным, если они не были изменены до момента инициализации класса. Также теперь стало возможным обращение к не финальным параметрам метода.
-
Может ли анонимный внутренний класс содержать статические методы?
Нет. У Анонимных внутренних классов, How и у внутренних классов не может быть статических полей, методов. (вспомним, что анонимные классы компorруются в обычные внутренние, а те, в свою очередь, связаны с an objectом обрамляющего класса)
-
Можно ли создать 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 обрамляющего класса. -
Можно ли объявлять внутренние классы
private
?Да, можно.
PS Обоснования так и не нашел, но на философии java встречались подобные примеры. Плюс IDE не ругается. Буду признателен за обоснование, но предположу, что в этом плане внутренний класс ничем не отличается от обычного класса.
-
Можно ли объявлять анонимные внутренние классы
private
?Аналогично (в плане не нашел обоснования). Можно объявить
private
переменную от типа которой наследуется наш анонимный класс. -
Сколько у класса максимально может быть внутренних классов?
Сколь угодно много. Ограничение особенности ОС и длинны имени файлов.
GO TO FULL VERSION