在Java中内部类有好几种,比如静态内部类,实例内部类还有局部内部类。这里主要解释一下匿名内部类,因为其他的在开发中用的很少了,基本不用,这里给大家介绍一下匿名内部类,介绍的目的不在于大家要去掌握它,也不在于大家就必须要学会,只是为了如果别人如果在代码中用到了匿名内部类你要能看懂。
匿名内部类是局部内部类的一种,因这个类没有名字而得名。首先先总结一下匿名内部类的优缺点吧!
优点:代码看上去高端上档次。
缺点:代码过于复杂,不易阅读,由于这个类没有名字,所以如果要用多次的话每次都要写,导致代码冗余。
这样干巴巴的说效果不是很好,看下面我们来看一个案例吧!
题目:创建一个计算接口,里面有一个两数求和的方法,然后定义一个数学类(不实现计算接口),里面也有一个两数求和的方法,该方法有三个参数(一个计算类型变量和两个求和的数)。
不使用匿名内部类:
public class Test {
public static void main(String[] args) {
MyMath mm = new MyMath();
Compute c = new ComputeImpi(); //多态,因为Compute是接口,不能直接创建对象
mm.sum(c,10,20);
}
}
//定义一个计算接口
interface Compute {
void sum(int a,int b);
}
class MyMath {
public void sum(Compute c,int a,int b) {
int res = a + b;
System.out.println(a + "+" + b + "=" + (a + b));
}
}
//定义一个ComputeImpi类去实现Compute接口
class ComputeImpi implements Compute{
public void sum(int a,int b) {
int res = a + b;
System.out.println(a + "+" + b + "=" + res);
}
}
使用匿名内部类:
public class Test {
public static void main(String[] args) {
MyMath mm = new MyMath();
mm.sum(new Compute() { //这里的第一个参数直接是创建了一个Compute对象,
// 只是在后面加了一堆大括号,然后在大口号里面去实现了这个接口,这就是匿
// 名内部类的用法。
public void sum(int a, int b) {
int res = a + b;
System.out.println(a + "+" + b + "=" + res);
}
}, 10, 20);
}
}
//定义一个计算接口
interface Compute {
void sum(int a,int b);
}
class MyMath {
public void sum(Compute c,int a,int b) {
int res = a + b;
System.out.println(a + "+" + b + "=" + (a + b));
}
}