2》匿名内部类
- 匿名内部类定义在外部类的局部位置,没有类名
- 匿名内部类语法
new 类或接口(参数列表){
类体
};
public class AnonymousInnerClass {
public static void main(String[] args) {
Outer outer = new Outer();
outer.outer_method1();
}
}
class Outer{
private int outer_i=20;
public void outer_method1(){
//基于接口的匿名内部类
//需求:使用接口创建一次性对象
//传统方式:写一个类实现该接口,并创建对象
//使用匿名内部类简化开发
/** jdk底层在创建匿名内部类Outer$1作为接口Car的一个实例,并且把地址返回给car这个对象变量
* 反编译时我们会经常看到
class Outer$1 implements Car{
public void run(){
...
}
}
*/
/**
* java多态的特性动态绑定
* car的编译类型:接口Car
* car的运行类型:当前匿名内部类(接口Car的实例Outer$1)
*/
Car car = new Car(){
public void run(){
System.out.println("我是汽车,我会跑");
}
};
car.run();
System.out.println("car的运行类型:"+car.getClass());//com.dome.Outer$1
//基于类的匿名内部类
/**
class Outer$2 extends Car{
public void run(){
...
}
}
*/
new Ferrari("法拉利"){
public void description(){
super.description();
System.out.println("匿名内部类重写父类的方法");
}
}.description();
//基于抽象类的匿名内部类
/**
class Outer$3 implements Car{
public void run(){
...
}
}
*/
new Vendor(){
@Override
void make_car() {
System.out.println("我是法拉利汽车制造商");
}
}.make_car();
}
}
abstract class Vendor{
abstract void make_car();
}
interface Car{
public void run();
}
class Ferrari{
private String name;
public Ferrari(String name){
this.name=name;
}
public void description(){
System.out.println("我是一辆"+name+"跑车");
}
}
- 当作实参直接传递,简洁高效
public class AnonymousInnerClass {
public static void main(String[] args) {
Outer2.f1(new Plant() {
@Override
public void description() {
System.out.println("我是竹子");
}
});
}
}
class Outer2{
public static void f1(Plant p) {
p.description();
}
}
interface Plant{
void description();
}