本篇中你可以了解到匿名内部类的使用、匿名内部类要注意的事项
一、匿名内部类的使用:由于匿名内部类没有名字,所以创建格式比较特殊:
new 父类构造器(参数列表){
匿名内部类的主体部分
}
new 接口(){
匿名内部类的主体部分
}使用匿名内部类我们必须要继承一个父类或者实现一个接口,并且只能继承一个父类或者实现一个接口。同时匿名内部类也没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象隐式的引用。/**
* @program:
* @description: 匿名内部类
* @author: 隔壁王叔叔
* @create: 2018-07-19 16:40
**/
abstract class Fish {
private String name;
public Fish() {
}
public Fish(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
abstract int swim();
}
public class Test {
public static void testFish(Fish fish) {
System.out.println(fish.getName() + "游了" + fish.swim() + "米");
}
public static void main(String[] args) {
testFish(new Fish() {
@Override
int swim() {
return 10000;
}
@Override
public String getName() {
return "鲲";
}
});
}
}=======================OutPut:鲲游了10000米
在Test类中,testFish(Fish fish)方法接收了一个Fish类型的数据,但Fish类是一个抽象类,抽象类是没有办法通过new构造器的方式创建对象的,所以必须要先有实现类,才能通过new的方式创建抽象类的实现类的对象。所以,在main方法中直接使用匿名内部类的方式,相当于创建了一个抽象类的实现类的对象由于匿名内部类不能是抽象类,所以它必须要实现它的抽象父类或者接口里面所有的抽象方法。 下面我们来将匿名内部类进行拆分: 首先,创建一个常规类来继承抽象类,并重写抽象父类中必须要重写的方法 class MyFish extends Fish{
@Override
int swim() {
return 10000;
}
@Override
public String getName() {
return "鲲";
}
}接下来,在main方法中,创建MyFish的对象,并将对象的引用作为testFish(Fish fish)方法的参数进行传递
MyFish myFish = new MyFish();
testFish(myFish);
匿名内部类存在一个缺陷:仅能被使用一次,使用匿名内部类时它会立即创建一个该类的对象,但并没有对应的变量来记录该类对象的引用,所以匿名内部类是不能够被重复使用。如果我们需要对testFish()方法里面传递的内部类进行多次使用,建议重新定义类来继承抽象类。
二、注意事项在使用匿名内部类的过程中,我们需要注意如下几点: 1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。 2、匿名内部类中是不能定义构造函数。 3、匿名内部类中不能存在任何的静态成员变量和静态方法。 4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。 5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
----by 隔壁王叔叔
|