-
익명 내부 클래스는 무엇으로 컴파일됩니까?
익명의 내부 클래스는
внешнийКласс$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();
. 누락된 링크를 제공하고 프로그램이 컴파일됩니다. -
익명의 내부 클래스를 상속받을 수 있나요?
익명 클래스를 설명함으로써 우리는 이미 일부 클래스를 상속하거나 일부 인터페이스를 구현하고 있습니다. 확장 또는 구현이라는 단어는 익명 클래스에 직접 적용할 수 없지만 익명 클래스를 사용하여 구현할 필수 인터페이스를 미리 준비하고 확장하도록 귀찮게 하는 사람은 없습니다. 아래 코드의 예입니다.
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