接口的使用需要一个实现类的对象,有时候只需要使用一次,那么能不能跳过实现类的定义呢?同样的,一个父类的实现有时候也需要靠子类,这个子类的定义可以省略吗?
public interface MyInterface {
void method();
}
下面是上面接口的实现类
public class MyInterfaceImpl implements MyInterface {
@Override
public void method() {
System.out.println("实现类覆盖重写了抽象方法");
}
}
下面的main方法中,前半部分用上面写的实现类调用method方法,而后半部分用的就是一个匿名类,在{}中覆盖重写了接口中的抽象方法,而后可以直接通过接口类型的变量调用method方法。
public class Demo {
public static void main(String[] args) {
// 以往new实现类MyInterfaceImpl()来调用method方法
MyInterfaceImpl myInerfaceimpl = new MyInterfaceImpl();
myInerfaceimpl.method();
MyInterface obj = new MyInterfaceImpl(); // 或者多态写法
obj.method();
// 今天学习了匿名内部类,不需要实现类
MyInterface AnonymousObject = new MyInterface() {
@Override
public void method() {
System.out.println("匿名内部类覆盖重写了抽象方法");
}
};
AnonymousObject.method();
}
}
//实现类覆盖重写了抽象方法
//实现类覆盖重写了抽象方法
//匿名内部类覆盖重写了抽象方法
格式解析:
接口名 对象名=new 接口名{…}
等号右边new代表创建对象的动作,接口名就是匿名内部类需要去实现的哪个接口的名称,{…}中是匿名内部类的内容,一般是对接口中所有抽象方法进行重写。
注意事项:
- 匿名内部类在创建对象的时候,只能使用唯一一次,想要再创建个对象,得整套再写一遍【 接口名 对象名2=new 接口名{…}】来获得第二个对象。
- 匿名内部类还可以以匿名对象的形式使用,这时候只能调用一次方法,再想用method()方法时已经找不到这个对象了,因为它是匿名的。如下代码:
- 匿名内部类是省略了【实现类/子类名称】,而匿名对象是省略了【对象名称】(如第2点)
new MyInterface() {
@Override
public void method() {
System.out.println("匿名内部类覆盖重写了抽象方法");
}
}.method();