匿名内部类
内部类: 在类的内部定义了一个新的类。 内部类。
内部类的分类:
静态内部类:类似于静态变量
实例内部类:类似于实例变量
局部內部类:类似于局部变量
使用内部类编写的代码,可读性很差。能不用尽量不用。
匿名内部类是 局部内部类中的一种。
因为这个类没有名字 而得名。
代码展示
public class Test {
//该类在类的内部,所以称为内部类
// 由于前面有static,所以称为 "静态内部类"
static class Inner1{
}
// 该类在类的内部,所以称为内部类
// 由于前面没有static, 所以成为 实例内部类。
class Inner2{
}
public void doSome(){
// 局部变量
int i = 100;
class Inner3{
}
}
public void doOther(){
// new Test().new Inner2(); // 两个new来new内部类
// doSome()方法中的局部内部类Inner3,在doOther()中不能用。
}
public static void main(String[] args) {
// 调用MyMath中的mySum方法
MyMath mm = new MyMath();
mm.sum(new ComputerInml(),100,200);
}
}
//负责计算的接口
interface Compute{
// 抽象方法
int sum(int a, int b);
}
// 编写一个compute的接口实现类
class ComputerInml implements Compute{
// 对方法的实现
public int sum(int a, int b){
return a+b;
}
}
class MyMath{
// 数学求和方法
public void sum(Compute c, int x, int y){
int retValue = c.sum(x,y); // 父类型引用 指向 子类型对象
System.out.println(x + "+" + y + "=" + retValue);
}
}
使用匿名内部类
public class Test {
//该类在类的内部,所以称为内部类
// 由于前面有static,所以称为 "静态内部类"
static class Inner1{
}
// 该类在类的内部,所以称为内部类
// 由于前面没有static, 所以成为 实例内部类。
class Inner2{
}
public void doSome(){
// 局部变量
int i = 100;
class Inner3{
}
}
public void doOther(){
// new Test().new Inner2(); // 两个new来new内部类
// doSome()方法中的局部内部类Inner3,在doOther()中不能用。
}
public static void main(String[] args) {
// 调用MyMath中的mySum方法
MyMath mm = new MyMath();
// mm.sum(new ComputerInml(),100,200);
// 使用匿名类,表示ComputerInml这个类没有名字。
// 这里表面看上去是接口可以直接new了
// 但是实际上不是接口可以new了
// 不建议使用匿名内部类,因为这个类,没名字,无法重复使用。代码乱
mm.sum(new Compute(){
public int sum(int a, int b){
return a + b;
}
} , 100, 200);
}
}
//负责计算的接口
interface Compute{
// 抽象方法
int sum(int a, int b);
}
class MyMath{
// 数学求和方法
public void sum(Compute c, int x, int y){
int retValue = c.sum(x,y); // 父类型引用 指向 子类型对象
System.out.println(x + " + " + y + " = " + retValue);
}
}
学习匿名内部类主要是让大家以后在阅读别人代码的时候,能够理解。
并不代表以后都要这样写。因为匿名内部类有两个缺点:
缺点1:太复杂,太乱,可读性差。
缺点2:类没有名字,以后想重复使用,不能用。