1.匿名内部类
在java中,如果该方法的参数 是一个接口类型,除了可以传入一个参数接口的实现类,还可以使用匿名内部类来作为该方法的参数,匿名内部类其实就是没有名称的内部类,在调用包含参数接口类型的方法时,通常为了简化代码,不会创建一个接口的实现类作为方法的传入,而是直接通过匿名内部类的形式传入一个接口类型参数
2.语法格式
new 父接口(){
//匿名内部类实现部分;
}
(1)不使用匿名内部类的写法
package pack;
interface Anmail {
void shout();
}
class Mycat implements Anmail {
String name = "小花";
@Override
public void shout() {
// TODO Auto-generated method stub
System.out.println(name + "喵喵喵");
}
}
public class Example01 {
public static void main(String[] args) {
anmailshout(new Mycat());
}
private static void anmailshout(Anmail an) {
// TODO Auto-generated method stub
an.shout();
}
}
public class Example01 {
public static void main(String[] args) {anmailshout(new Mycat());
}private static void anmailshout(Anmail an) {
// TODO Auto-generated method stub
an.shout();
}
}
这一块代码定义了anmailshout的方法,该方法是静态方法,随着类的加载而加载,当该方法的参数是接口类型,这是我们就应该思考,如何对这个接口类型参数实例化,因为学习接口的时候我们已经了解到,接口里面是抽象方法,接口是不能直接实例化的,即Anmail an=new Anmail();是错误的
所以我们需要一个类实现接口,然后创建这个类的对象作为参数,
Anmail an=new Mycat();当然这个里面也涉及了一个多态方面的向上转型问题。
如果写代码未免会有点太过于繁琐,所以我们引出了匿名内部类。
package pack;
interface Anmail {
void shout();
}
public class Example01 {
public static void main(String[] args) {
String name = "小花";
anmailshout(new Anmail() {
@Override
public void shout() {
// TODO Auto-generated method stub
System.out.println(name + "喵喵喵");
}
});
}
private static void anmailshout(Anmail an) {
// TODO Auto-generated method stub
an.shout();
}
}
所以大家不要把new Anmail()看做接口对象的实例化,其实这只是匿名内部类的一种写法。