写在前面的话:
我一直相信对于知识:如果你看不懂,不怪你,请相信,一定是作者没有把问题说清楚。
看了本文章你将知道什么是匿名内部类,如何熟练掌握并使用匿名内部类。如果你已经是大牛可以跳过,没有看的必要。
什么是匿名内部类What
先说类,我们都知道类用于描述客观世界里某一类对象的共同特征,对象是其具体体现。类可以被被认为是一种自定义的数据类型,可以使用类来定义变量。也就是所说的类类型,是一种引用数据类型。
如果在一个类里面定义一个类,那么这个类就是内部类,外面的那个类就是外部类,这个很好理解。内部类就相当于外部类的一个成员,你可以把内部类看成一个整体。内部类分为:静态内部类,非静态内部类。匿名内部类是非静态内部类的一种特殊情况,匿名内部类没有类名,因此就不可能有构造函数,不能创建对象。除此之外还有局部内部类,就是定义在方法内的,这个一般不怎么用,不需要掌握,知道就好,本文主要说匿名内部类,其他内部类以后会说。
为什么会有匿名内部类
说白了,就是因为想偷懒,不想写太多代码。如果可以,程序员完全可以通过实现接口或者继承抽象类的方式来实现而不用创建匿名内部类。但是使用匿名内部类的优点是显而易见的,可以少些代码,而且代码更加简洁。
匿名内部类的定义
先看匿名内部类的定义的语法格式:
new 实现接口()
{
//匿名内部类类体部分
}
new 父类构造器(实参列表)
{
//匿名内部类类体部分
}
为什么匿名内部类的定义有这两种方式呢?这是因此这两种方式的定义分别对应两种方式,一种是接口,另一种是抽象类。
对于实现接口,由于接口是没有构造函数的,注意这里一定是空参数。
第二种是调用父类的构造器,注意此处可以是空参数,也可以传入参数。
如何使用匿名内部类
对于匿名内部类的使用,我将通过两个具体的例子进行说明,如果你看懂了这两个例子,就基本掌握了他的使用,建议多看几遍例子。
第一种情况:实现接口
interfance Product
{
public double getPrice();
public String getName();
}
上面代码定义一个接口,接口里面两个抽象方法
public class Anonymous
{
public void test (Product p)
{
System.out.println(p.getName()+"--------"+p.getPrice());
}
public static void main(String [ ] args )
{
Anonymous as= new Anonymous ();
as.test(new Product( )//此处实现接口并实现抽象方法
{
public double getPrice( )//实现方法
{
return 8888;
}
public String getName( )//实现方法
{
return "I can do it ";
}
});
}
}
上面代码很简单,就是定义了一个类Anonymous,在类里定义了一个test方法。然后就是创建Anonymous对象,调用他的实例方法test()。
不过调用test()方法时,要传入一个Product对象。但是由于Product是一个接口,无法创建对象,所以要实现该接口。因此此处采用匿名内部类的方式进行,并实现接口中全部的抽象方法!