在程序当中我们对某些类的实例只使用一次,那这个类的名字对于程序而言就可有可无,在这种场景下将类的定义与类的创建放到一起完成来简化程序的编写,用这种方式定义的没有名字的类就叫做匿名内部类。
我们创建一个抽象类命名为Person
package anorrymous;
public abstract class Person {
public Person(){
}
public abstract void read();
}
接下来我们再创建两个类Man和Woman分别继承抽象类Person重写read抽象方法
package anorrymous;
public class Man extends Person{
@Override
public void read() {
System.out.println("男生喜欢看小说");
}
}
package anorrymous;
public class Woman extends Person{
@Override
public void read() {
System.out.println("女生喜欢看诗歌");
}
}
最后创建一个测试类PersonTest,我们将用两种方式实现read方法。
package anorrymous;
public class PersonTest {
//方案1:根据传入的不同的实例对象的类型,调用相应的read方法
public void getRead(Person person){
person.read();
}
public static void main(String[] args) {
PersonTest test=new PersonTest();
Man one=new Man();
Woman two=new Woman();
test.getRead(one);
test.getRead(two);
//方案2:匿名内部类
test.getRead(new Person() {
@Override
public void read() {
System.out.println("男生喜欢看小说");
}
});
test.getRead(new Person() {
{
//构造代码块
}
@Override
public void read() {
System.out.println("女生喜欢看诗歌");
}
});
}
}
运行结果:
男生喜欢看小说
女生喜欢看诗歌
男生喜欢看小说
女生喜欢看诗歌
方案1是通过创建getRead方法,将Man和Woman实例化,根据传入的不同的实例对象的类型,调用相应的read方法。
方案2则是通过匿名内部类实现相同的效果。
由此可知匿名内部类在实例对象的同时,完成对象内容重写,在其中没有类型的名字,也没有这个类型实例的名字。
特点:
1.没有类型名称,没有实例对象名称
2.无法用public、private、protected、abstract、static修饰
3.无法编写构造方法,可以添加构造代码块
4.不能出现静态成员
5.匿名内部类可以实现接口,也可以继承父类,但是不能同时进行
作用: 简化对于抽象类和接口的操作。
适用场景:
1.只用到一个类的实例
2.类在定义后马上用到
3.给类命名不会导致代码更容易给理解
优点: 在某些场景对内存的损耗和系统性能的影响相对较小。
缺点: 每次使用的时候,都需要重写。
注:本篇文章仅个人见解,若有错误,欢迎指正!