匿名内部类:
可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类
内部类顾名思义是定义在一个类内部的类,而匿名内部类即为该内部类没有名字,类似于匿名对象,与之相同,匿名内部类也只能使用一次
格式:
类名 对象名 = new 类名(可以是抽象类也可以是接口){
重写其中的所有抽象方法
}
与匿名对象相似的是:匿名内部类省略实现类或者子类,而匿名对象省略了对象名称,其共同点是都只能使用唯一的一次
一般我们使用匿名内部类多是为了简化代码量,可以不用创建实现类或者抽象类的子类,然后直接使用。匿名内部类一般只能重写父类中的方法,不建议新定义方法,这样反而会增大代码量,匿名内部类是一种多态的用法,可以调用父类中的所有方法。
普通内部类如下:
public class InnerClass {
public class sonClass{
public void methodSon(){
System.out.println("内部类的方法");
}
}
public void methodMain(){
System.out.println("外部类的方法");
new sonClass().methodSon();
}
public static void main(String[] args) {
new InnerClass().methodMain();
}
}
此时可以通过外部类来访问内部类的方法,当我们查看生成的编译文件时我们会发现,文件名为:
InnerClasssonClass,如果我们创建的是一个匿名内部类,那么生成的文件名为:Class文件名sonClass,如果我们创建的是一个匿名内部类,那么生成的文件名为:Class文件名sonClass,如果我们创建的是一个匿名内部类,那么生成的文件名为:Class文件名阿拉伯数字
匿名内部类如下:
此时我们生成了一个接口
public interface Blog {
void run();
}
创建匿名内部类调用run方法
new Blog(){
@Override
public void run() {
System.out.println("正在跑步");
}
}.run();
此时我们可以调用接口中的run方法,输出正在跑步
实战实例:
利用Thread类进行演示
Object obj = new Object();
new Thread(){
@Override
public void run() {
while (true){
synchronized (obj){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" Hello");
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start();
new Thread(){
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj){
System.out.println(Thread.currentThread().getName()+" World");
obj.notify();
}
}
}
}.start();
此时利用了匿名内部类直接实现调用Threa类中的方法,循环输出HelloWorld字样。我们可以看出采用匿名内部类简化了代码,可以不用创建抽象类的子类进行实现,但是此时只能使用一次,如果需要再次使用,则必须再次创建一个匿名内部类。