匿名内部类
内部类
在A类的内部中若存在一个B类,则B类为内部类,A类是B类的外部类。
publi class A {
class B{
// 内部类
}
}
内部类可以调用外部类的方法和属性,外部类需通过创建内部类对象来调用内部类的方法和属性。
外部类.内部类 对象 = new 外部类().new 内部类();
匿名内部类
匿名内部类就是没有名字的内部类
当我们实现接口时,需要先定义子类、重写方法、创建子类对象然后调用子类重写后的方法
匿名内部类可以简化实现接口的步骤,可以快速的写出一个虚拟类的子类或者一个接口的实现类,所以其实本质创建一个类继承自父类,所以普通类也可以使用匿名内部类
匿名内部类实现条件
必须实现一个父接口或者继承父类。
new 父类或接口 {
@Override
public void 方法名() {
代码块;
}
}
使用例子
定义接口
public interface People {
void eat();
}
实现匿名内部类
// 重写方法
new People() {
@Override
public void eat() {
System.out.println("人需要吃饭。");
}
}
//调用方法
new People() {
@Overried
public void eat() {
System.out.println("人需要吃饭。");
}
}.eat;
为匿名对象命名
People xiaoming = new People() {
@Overried
public void eat() {
System.out.println("小明需要吃饭。");
}
}
Xiaoming.eat(); // 通过命名调用。
将抽象类或接口作为参数
存在方法func
public static void func(People p) {
p.eat();
}
接口作为参数
直接作为参数传递
func(new People() {
@Override
public void eat() {
System.out.println("人需要吃饭。");
}
})
// 也可以给匿名内部类命名,然后传入方法
People xiaoming = new People() {
@Overried
public void eat() {
System.out.println("小明需要吃饭。");
}
}
func(xiaoming);
抽象类作为参数:
同接口做参数
匿名内部类双大括号
例子
addOption(new HashMap<Integer,String>(){{
put(1, "test");
put(2, "work");
}},quesId);
第一层括号表示定义了一个匿名内部类
第二层括号表示构造方法,因为该类没有名字。当执行时,改构造方法可以调用父类中的put函数进行初始化。
匿名内部类继承Object,里面自带equals方法,相当于重写了接口里的equals方法,同理,如果一个类实现多个接口,这些接口里又有相同的方法的话,只用重写一次就行了。