什么是匿名内部类
匿名内部类是 Java 编程语言中一种特殊的类,它没有显式地定义类名,而是在创建对象时通过传递实现了某个接口或继承了某个类的代码块来定义类。通常,我们使用它来简化代码、减少类的数量和更高效地编写事件处理程序等。
为什么要使用匿名内部类
在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码。
详细解释
不使用匿名内部类
比如下面的代码,定义了一个接口,接口里面有一个show方法
public interface Interface01 {
void show();
}
为了使用该接口的show方法,我们需要去创建一个实现类,同时书写show方法的具体实现方式
public class Interface01Impl implements Interface01{
@Override
public void show() {
System.out.println("奋斗5天,期末考试我要过Java");
}
}
在上面的代码中,实现类Interface01全程只使用一次,为了这一次的使用要去创建一个类,未免太过麻烦。那么我们可以使用匿名内部类。
使用匿名内部类
public static void main(String[] args) {
Interface01 interface01 = new Interface01() {
@Override
public void show() {
System.out.println("奋斗5天,期末考试我要过Java");
}
};
//调用接口方法
interface01.show();
}
书写匿名内部类的格式
方法一
这种方法和之前的多态基本上没有区别
new 接口/类名(参数1, 参数2...){
实现方法1(){
}
实现方法2(){
}
......
};
方法二
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("奋斗5天,期末考试我要过Java");
}
}).start();
匿名内部类的应用例子
题目1
在程序的show()方法里面定义Father类的匿名子类,重写Father类的method()方法,并在合适的位置调用method()方法
abstract class Father {
int num;
public Father(int num) {
this.num = num;
}
public abstract void method();
}
class Niming {
public void show() {
Father father = new Father(10) { // 定义 Father 类的匿名子类
@Override
public void method() { // 重写 Father 类的 method() 方法
System.out.println("Father 类的匿名子类重写了 method() 方法");
System.out.println("num 的值为:" + num);
}
};
father.method(); // 在合适的位置调用 method() 方法
}
}
public class InnerClasssDemo5 {
public static void main(String[] args) {
Niming niming = new Niming();
niming.show();
}
}
运行结果
Father 类的匿名子类重写了 method() 方法
num 的值为:10
方法二
interface InterFace1 {
int num = 100;
void method();
}
class Niming2 {
public void show() {
InterFace1 interFace1 = new InterFace1() { // 定义实现了 InterFace1 接口的匿名内部类
@Override
public void method() { // 重写 InterFace1 接口中的 method() 方法
System.out.println("InterFace1 接口的匿名内部类重写了 method() 方法");
System.out.println("num 的值为:" + num);
}
};
interFace1.method(); // 在合适的位置调用 method() 方法
}
}
public class InnerClassDemo6 {
public static void main(String[] args) {
Niming2 niming2 = new Niming2();
niming2.show();
}
}