匿名内部类
是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。
开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作,
- 定义子类
- 重写接口中的方法
- 创建子类对象
- 调用重写后的方法
我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快
捷方式。
说白了,就是为了偷懒实现接口。直接看例子理解:
定义接口:
interfance Product
{
public double getPrice();
public String getName();
}
这里面Anonymous类里面的test方法,依赖于Product接口,但是接口显然是没有实现的。如果常规做我们还需要先去写个实现类来实现Product接口。但是,有了匿名内部类,就可以简便得操作了。
基本形式如下:
new 实现接口()
{
//匿名内部类类体部分 --写具体的类实现
}
其中重点注意这一行
/*
1.等号右边:定义并创建该接口的子类对象
2.等号左边:是多态,接口类型引用指向子类对象
*/
Anonymous as= new Anonymous ();
这里又引入多态概念,多态简单来说就是同一个行为通过不同的对象表达出不同的特性。形式就是 父类 name = new 子类(),也是一种简化代码的写法,只需要调用父类的类名,再提供子类的重写,就可以表示出子类的特性。
以下是匿名内函数的示例:
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 ";
}
});
}
}
以下是多态示例:
//定义父类
public abstract class Animal {
public abstract void eat();
}
//定义子类
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
}
多态调用示例:
public class Test {
public static void main(String[] args) {
// 多态形式,创建对象
Animal a1 = new Cat();
// 调用的是 Cat 的 eat
a1.eat();
// 多态形式,创建对象
Animal a2 = new Dog();
// 调用的是 Dog 的 eat
a2.eat();
}
}