Анонимные классы — это классы, которые не могут иметь имен, поэтому на них невозможно ссылаться. Они должны быть объявлены как часть нового утверждения во время создания. Для этого требуется другая форма оператора new, например: new <класс или интерфейс> <тело класса> Эта форма оператора new объявляет новый анонимный класс, который расширяет данный класс или реализует данный интерфейс. Он также создает новый экземпляр этого класса и возвращает его как результат оператора. Класс, который нужно расширить, и интерфейс, который нужно реализовать, — это операнды нового оператора, за которыми следует тело анонимного класса. Если анонимный класс расширяет другой класс, его тело может получать доступ к членам класса, переопределять его методы и т. д., как и любой другой стандартный класс. Если анонимный класс реализует интерфейс, его тело должно реализовывать методы интерфейса.
Java-код
Скопируйте код кода следующим образом:
интерфейс пр
{
недействительная печать1 ();
}
публичный класс noNameClass
{
публичный PR-адрес()
{
вернуть новый пр(){
общественная пустота print1()
{
System.out.println("Привет, мир!!");
}
};
}
public static void main(String args[])
{
noNameClass c = новый noNameClass();
пр hw=c.dest();
hw.print1();
}
}
PR также может быть классом, но метод, который вы вызываете извне, должен быть объявлен в вашем классе или интерфейсе. Методы внутри анонимного класса не могут быть вызваны извне.
Возможно, наиболее часто используемое место для внутренних анонимных классов в Java — это добавление Listner во Frame.
следующее:
Java-код
Скопируйте код кода следующим образом:
импортировать java.awt.*;
импортировать java.awt.event.*;
публичный класс QFrame расширяет Frame {
общественный QFrame() {
this.setTitle(/"мое приложение/");
addWindowListener (новый WindowAdapter () {
public void windowClosing(WindowEvent e) {
распорядиться();
Система.выход(0);
}
});
this.setBounds(10,10,200,200);
}
}
Внутренний анонимный класс предназначен для создания внутреннего класса, но он не дает вам имени, то есть нет переменной, которая ссылается на экземпляр.
Скопируйте код кода следующим образом:
новый WindowAdapter() {
public void windowClosing(WindowEvent e) {
распорядиться();
Система.выход(0);
}
}
new заключается в создании объекта WindowAdapter, а следующий {} указывает, что операция в скобках действует на имя объекта по умолчанию, а следующий код в приведенной выше программе Java является телом функции.
Целью такого использования является создание экземпляра объекта и переопределение одной из его функций. Вы можете найти его, открыв код WindowAdapter. Это абстрактный класс. Это реализация интерфейса WindowListener. Параметр Frame.addWindowListner() — это WindowListner, а реализация заключается в передаче анонимного класса, производного от WindowAdapter.
1. Как определить существование анонимного класса? Я не вижу имени, такое ощущение, что это просто объект, созданный new из родительского класса, а для анонимного класса нет имени.
Давайте сначала посмотрим на псевдокод
Скопируйте код кода следующим образом:
абстрактный класс Отец(){
....
}
тест публичного класса {
Father f1 = new Father(){ .... } //Здесь есть анонимный внутренний класс
}
Вообще говоря, при создании нового объекта после скобок должна стоять точка с запятой, то есть оператор нового объекта заканчивается.
Но все по-другому, когда есть анонимные внутренние классы. За круглыми скобками следуют фигурные скобки, а в фигурных скобках содержится конкретный метод реализации нового объекта.
Потому что мы знаем, что абстрактный класс не может быть новым напрямую. Прежде чем мы сможем создать новый класс реализации, должен существовать класс реализации.
Приведенный выше псевдокод указывает, что new — это класс реализации Father, и этот класс реализации является анонимным внутренним классом.
Фактически, разделение вышеупомянутого анонимного внутреннего класса может быть
Скопируйте код кода следующим образом:
класс SonOne расширяет Father{
...//Код здесь такой же, как и в анонимном внутреннем классе выше, код в фигурных скобках
}
тест публичного класса {
Отец f1 = новый SonOne();
}
2. Меры предосторожности для анонимных внутренних классов. Обратите внимание, что объявление анонимных классов выполняется во время компиляции, а создание экземпляров — во время выполнения. Это означает, что новый оператор в цикле for создаст несколько экземпляров одного и того же анонимного класса, а не один экземпляр нескольких разных анонимных классов.
При использовании анонимных внутренних классов помните о следующих принципах:
・Анонимные внутренние классы не могут иметь конструкторов.
・Анонимные внутренние классы не могут определять статические члены, методы и классы.
・Анонимные внутренние классы не могут быть общедоступными, защищенными, частными или статическими.
・Можно создать только один экземпляр анонимного внутреннего класса.
・За new должен стоять анонимный внутренний класс, который используется для неявной реализации интерфейса или реализации класса.
・Поскольку анонимные внутренние классы являются локальными внутренними классами, на них распространяются все ограничения на локальные внутренние классы.
・Внутренние классы могут получать доступ только к статическим переменным или статическим методам внешних классов.
это в анонимных классах и внутренних классах:
Иногда мы будем использовать некоторые внутренние классы и анонимные классы. При использовании this в анонимном классе это относится к анонимному классу или самому внутреннему классу. На данный момент, если мы хотим использовать методы и переменные внешнего класса, нам следует добавить имя класса внешнего класса.
3. Роль анонимных внутренних классов
Внутренние классы Java фундаментально отличаются от вложенных классов в C++: вложенные классы C++ не имеют дескрипторов классов-оболочек. Он лишь выражает концепцию инкапсуляции; но внутренний класс Java отличается: он может обращаться к членам класса-оболочки (что означает, что у него есть дескриптор класса-оболочки).
Анонимные внутренние классы — это упрощенный способ написания внутренних классов: return new Wrapper {
...
};
Эквивалент: Wrapped расширяет Wrapper {
...
}
вернуть новый Wrapped();
Это единственная роль анонимных внутренних классов?
Рассмотрим этот случай:
Скопируйте код кода следующим образом:
интерфейс ICount {
число интервалов();
}
класс Родитель {
интервал я = 0;
число int() {
вернуть я++;
}
}
Существует класс Child, который не только хочет наследовать метод count() родительского элемента, но также хочет реализовать метод count в интерфейсе ICount. Что мне теперь делать? Внутренние классы могут вступить в игру:
Скопируйте код кода следующим образом:
класс Child расширяет Parent {
ICount getCount() {
вернуть новый ICount {
интервал я = 0;
число int() {
возврат (я *= 2);
}
}
}
}
посмотрите на этот код
Скопируйте код кода следующим образом:
public static void main(String[] args) {
theApp = новый анализатор();
SwingUtilities.invokeLater(new Runnable() { // Анонимный класс Runnable
// объект
public void run() { // Запуск метода, выполняемого в потоке
theApp.creatGUI(); // Вызов создателя статического графического интерфейса.
}
});
}
public static void main(String[] args) {
theApp = новый анализатор(); // Создание объекта
SwingUtilities.invokeLater(new Runnable() { // Анонимный класс Runnable
// Анонимный внутренний класс, реализующий поток
// Первоначально этот метод должен был передавать параметр типа Runnable // Этого можно добиться с помощью этого анонимного метода класса
// объект
public void run() { // Запуск метода, выполняемого в потоке
theApp.creatGUI(); // Вызов создателя статического графического интерфейса.
}
});
}