正常情况下我们实现一个接口需要定义一个类去实现。
举个例子:
interface A{ b(); c(); } class B implements A{ b(){...}; c(){...}; } A a = new B(); 接口多态 a.b(); a.c();
那现在不想定义一个类,就可以使用匿名内部类来实现接口。
匿名内部类
语句定义格式:
new 类名(可以是抽象类也可以具体的类)/接口(){
要重写的方法;
};
那上述例子就可以改进为:
interface A { b(); c(); }//使用匿名内部类的形式创建对象调用b方法 new A(){ b(){...} c(){...} }.b();
很明显减少了代码量。
匿名内部类存在的前提:
要存在一个类或者是一个接口,这个类可以是具体的类也可以是抽象的类。
想一想,我现在的接口中,只有两个方法,方法的个数比较少,没调用一个方法,都要new一下,并且new之后的内容都是一样的。如果以后接口中的方法很多的时候,你再用这样的方法,就会很麻烦。怎么改进呢?
利用接口多态的形式给匿名内部类起名字。
A a = new A(){ b(){...} c(){...} };a.b();//调用b()方法
a.c();//调用c()方法
匿名内部类在开发中的使用
直接看代码:
interface Person{ public abstract void study(); } class PersonDemo{ Person person; // Person person = new ..(); PersonDemo(Person person){ // Person person = new Student(); this.person = person; } public void fun(Person person){ person.study(); } } public class InnerClassDemo8 { public static void main(String[] args) { //使用匿名内部类的形式创建对象 Person person = new Person() { @Override public void study() { System.out.println("好好学习"); } }; person.study(); //使用匿名内部类进行方法传参 PersonDemo personDemo = new PersonDemo(new Person() { @Override public void study() { System.out.println("这是匿名内部类使用带参构造方法"); } }); new PersonDemo(new Person() { @Override public void study() { System.out.println("这是匿名内部类使用带参构造方法"); } }).fun(new Person() { @Override public void study() { System.out.println("好好学习天天向上2"); } }); new PersonDemo(new Person() { @Override public void study() { System.out.println("这是匿名内部类使用带参构造方法"); } }).person.study(); } }
结果:
好好学习
好好学习天天向上2
这是匿名内部类使用带参构造方法