Java匿名内部类
1 概述
对于许多小伙伴来说,第一次听到到匿名内部类这个概念不是很清楚,我也一样。而且任何东西的出现都有它出现的意义,匿名内部类也是如此,它刚开始出现时肯定在Java中起到了它自己不可替代的作用。于是这周特意在网上学习了关于匿名内部类这个知识点并且在这里写个博客记录下。
2 匿名内部类
概念:匿名内部类其实就是没有名称的内部类
说明:在调用包含有接口类型的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。
匿名内部类的前提:必须是类或接口
格式:new 类名/接口名{
重写抽象方法
}
在说匿名内部类之前,我们可以先回顾下
先定义一个父类(里面只有一个抽象方法):
public abstract class Animal {
public abstract void eat();
}
定义一个父类的子类(重写父类的抽象方法):
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狼行千里吃肉,狗行千里吃翔");
}
}
测试及测试结果:
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
}
}

这个时候可以发现这个Animal抽象类里面只有一个方法,我们要先定义一个类然后继承这个抽象类,再然后重写这个方法。这个步骤也太繁琐了,完全没有这个必要啊!能不能直接将这个子类对象给创造出来呢?于是就想到了匿名内部类了
public static void main(String[] args) {
//整体等价于Animal父类的子类对象
new Animal(){
@Override
public void eat() {
System.out.println("狼行千里吃肉,狗行千里吃翔");
}
};
}
可以运行下上面代码,发现并没有输出语句输出。是为什么呢?因为这个其实只是相当于我们之前定义的那个子类对象,并没有去调用它的方法。那么如何调用呢:有两种方式:
第一种:
public static void main(String[] args) {
//整体等价于Animal父类的子类对象
new Animal(){
@Override
public void eat() {
System.out.println("狼行千里吃肉,狗行千里吃翔");
}
}.eat();
}
第二种:
public static void main(String[] args) {
//整体等价于Animal父类的子类对象
Animal animal = new Animal() {
@Override
public void eat() {
System.out.println("狼行千里吃肉,狗行千里吃翔");
}
};
animal.eat();
}
除此之外,有了匿名内部类之后,可以当做参数传递。
public class Demo1 {
public static void main(String[] args) {
function(
new Animal() {
@Override
public void eat() {
System.out.println("狼行千里吃肉,狗行千里吃翔");
}
}
);
}
public static void function(Animal animal){
animal.eat();
}
}

以上是使用匿名内部类是类的情况,接口的形式也是如此。

浙公网安备 33010602011771号