JavaSE——内部类(匿名内部类)
概述
匿名内部类
格式
new 类名或者接口名() {
重写方法;
};
包含了:
-
继承或者实现关系
-
方法重写
-
创建对象
所以从语法上来讲,这个整体其实是匿名内部类对象
什么时候用到匿名内部类
实际上,如果我们希望定义一个只要使用一次的类,就可考虑使用匿名内部类。匿名内部类的本质作用
是为了简化代码。
之前我们使用接口时,似乎得做如下几步操作:
-
定义子类
-
重写接口中的方法
-
创建子类对象
-
调用重写后的方法
interface Swim {
public abstract void swimming();
}
// 1. 定义接口的实现类
class Student implements Swim {
// 2. 重写抽象方法
@Override
public void swimming() {
System.out.println("狗刨式...");
}
}
public class Test {
public static void main(String[] args) {
// 3. 创建实现类对象
Student s = new Student();
// 4. 调用方法
s.swimming();
}
}
我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。
匿名内部类前提和格式
匿名内部类必须继承一个父类或者实现一个父接口。
匿名内部类格式
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
package com.zhao.innerclassdemo2;
public abstract class Animal {
public abstract void eat();
}
package com.zhao.innerclassdemo2;
public interface Swim {
public abstract void swim();
}
package com.zhao.innerclassdemo2;
public class Test {
public static void main(String[] args) {
//new出来的是匿名内部类的一个对象并且继承了Animal父类
//因为Animal是一个抽象类所以在内部类中要重写抽象方法
new Animal(){
//下面这块才是匿名内部类
@Override
public void eat() {
System.out.println("重写了eat()方法");
}
};//这个;分号不能省 实际上是new Animal(){};大括号中才是内部类
//new出来的实际上是一个实现了Swim()接口的匿名内部类
//因为这个内部类对象实现了Swim接口,所以要重写接口内的抽象方法
new Swim(){
@Override
public void swim() {
System.out.println("重写了接口游泳的方法");
}
};//同样;分号不能省
}
}
匿名内部类的特点
-
定义一个没有名字的内部类
-
这个类实现了父类,或者父类接口
-
匿名内部类的使用场景
通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。代码如下:
interface Swim {
public abstract void swimming();
}
public class Demo07 {
public static void main(String[] args) {
// 普通方式传入对象
// 创建实现类对象
Student s = new Student();
goSwimming(s);
// 匿名内部类使用场景:作为方法参数传递
Swim s3 = new Swim() {
@Override
public void swimming() {
System.out.println("蝶泳...");
}
};
// 传入匿名内部类
goSwimming(s3);
// 完美方案: 一步到位
goSwimming(new Swim() {
public void swimming() {
System.out.println("大学生, 蛙泳...");
}
});
goSwimming(new Swim() {
public void swimming() {
System.out.println("小学生, 自由泳...");
}
});
}
// 定义一个方法,模拟请一些人去游泳
public static void goSwimming(Swim s) {
s.swimming();
}
}

浙公网安备 33010602011771号