Java内部类(匿名内部类)_YWenXing的博客-CSDN博客
匿名内部类(重要)
1、匿名内部类
本质上是一个没有名字的局部内部类,定义在方法中、代码块中等。
作用:方便创建子类对象,最终目的是为了简化代码编写。
2、格式
new 类|抽象类名|或者接口名(){
重写方法;
}
范例:
public class Bar extends Boo {
Bar() {
}
Bar(String s) {
super(s);
}
static void main() {
Boo annoymousInnerBoo1 = new Boo() {
};
Boo annoymousInnerBoo2 = new Boo("hi") {
};
Bar annoymousInnerBar1 = new Bar() {
@Override
void zoo() {
}
};
Bar annoymousInnerBar2 = new Bar() {
};
method(new Bar() {
});
}
static void method(Bar bar) {
}
void zoo() {
}
}
3、特点总结
匿名内部类是一个没有名字的内部类。
匿名内部类写出来就会产生一个匿名内部类的对象。不仅声明了一个类,同时创建了对象实例。
匿名内部类的对象类型相当于是当前new的那个的类的子类。所以才会有重写@Override。
4、使用场景
匿名内部类作为方法的实际参数,即在调用方法时,在参数部分定义一个匿名内部类。
4.anonymous inner class
which one create an anonymous inner class from within class bar?
public class Boo {
Boo(String s) {}
Boo() {}
}
public class Bar extends Boo {
Bar() {}
Bar(String s) {super(s);}
void zoo() {}
static void main() {
Boo f = new Boo("") {};
}
}
A: Boo f = new Boo(24) {}; // 语法错误,构造函数的参数为String
B: Boo f = new Bar() {}; //正确,或者Boo f = new Bar("s") {};
C: Bar f = new Boo(String s) {}; // 注意:在匿名内部类中,子类无法类型转换为父类,普通类可以。
D: Bar f = new Boo.Bar(String s) {}; // 不存在Boo.Bar。
关键一是Boo f = new Bar(); 和Boo f = new Bar() {};的区别,前者是调用构造函数实例化类,后者是定义一个匿名内部类并实例化。
二是定义匿名内部类时会用到Bar类的构造函数,参数必须匹配。