📅  最后修改于: 2020-04-06 04:55:50             🧑  作者: Mango
先决条件:Java中的嵌套类
这是一个没有名称的内部类,并且仅为其创建一个对象。当使用某些“额外”(例如类或接口的重载方法)创建对象的实例时,匿名内部类可能很有用,而不必实例化子类。
匿名内部类对于编写图形编程中的侦听器接口的实现类很有用。
匿名内部类主要以两种方式创建:
语法:匿名类表达式的语法类似于构造函数的调用,只是代码块中包含类定义。
// Test可以是interface,abstract/concrete类
Test t = new Test()
{
// 数据成员和方法
public void test_method()
{
........
........
}
};
要了解匿名内部类,让我们展示一个简单的程序:
//Java展示匿名内部类
interface Age
{
int x = 21;
void getAge();
}
class AnonymousDemo
{
public static void main(String[] args)
{
// Myclass实现了Age接口
MyClass obj=new MyClass();
// 调用getage()方法
obj.getAge();
}
}
// Myclass实现了Age接口
class MyClass implements Age
{
@Override
public void getAge()
{
//打印age
System.out.print("年龄 "+x);
}
}
在程序中,使用AgeAget()方法和x = 21创建接口Age。Myclass被编写为Age接口的实现类。正如在Program中所做的那样,无需编写单独的类Myclass。而是直接将Myclass的代码复制到此参数中,如下所示:
Age oj1 = new Age() {
@Override
public void getAge() {
System.out.print("年龄 "+x);
}
};
在这里,没有创建Age对象,而是创建了Myclass对象,并将其复制到整个类代码中,如上所示。这仅对于匿名内部类是可能的。这样的类称为“匿名内部类”,因此在这里我们将“ Myclass”称为匿名内部类。
上述程序的匿名内部类版本
//Java程序展示匿名内部类
interface Age
{
int x = 21;
void getAge();
}
class AnonymousDemo
{
public static void main(String[] args) {
// Myclass是Age接口的隐藏的内部类
Age oj1 = new Age() {
@Override
public void getAge() {
// 打印age
System.out.print("年龄 "+x);
}
};
oj1.getAge();
}
}
匿名内部类的类型:根据声明和行为,有3种匿名内部类:
//Java展示创建一个立即线程,使用匿名内部类进行拓展
class MyThread
{
public static void main(String[] args)
{
// 使用匿名内部类
Thread t = new Thread()
{
public void run()
{
System.out.println("子线程");
}
};
t.start();
System.out.println("主线程");
}
}
输出:
主线程
子线程
OR
子线程
主线程
//Java程序定义接口,使用匿名内部类实现接口
class MyThread
{
public static void main(String[] args)
{
//使用匿名内部类实现接口Runnable
Runnable r = new Runnable()
{
public void run()
{
System.out.println("子线程");
}
};
Thread t = new Thread(r);
t.start();
System.out.println("主线程");
}
}
输出:
主线程
子线程
OR
子线程
主线程
//Java 定义一个线程,使用匿名内部类
class MyThread
{
public static void main(String[] args)
{
// 使用匿名内部类
Thread t = new Thread(new Runnable()
{
public void run()
{
System.out.println("子线程");
}
});
t.start();
System.out.println("主线程");
}
}
输出:
主线程
子线程
OR
子线程
主线程
普通/常规类和匿名内部类之间的区别:
访问封闭范围的局部变量,以及声明和访问匿名类的成员
与局部类一样,匿名类也可以捕获变量。它们对包含范围的局部变量具有相同的访问权:
匿名类在成员方面也具有与本地类相同的限制:
请注意,您可以在匿名类中声明以下内容:
但是,不能在匿名类中声明构造函数。