匿名内部类和普通的内部类的理解相似,本质上是类,特殊的是匿名内部类只使用一次,当业务中存在这种需求时可以是用匿名内部类,并且其广泛使用在函数式编程中;匿名内部类支持在定义这个类时就会创建一个对象;
//1.
public static void main(String args[]){
wolf.eat(new Animal(){//Animal可以是一个类,也可以是一个接口
//此时后面的{}就是一个匿名内部类,当Animal是一个接口时,此匿名内部类需要实现此接口全部的抽象方法
//(并且匿名内部类和Animal直接是implement关系),
//即重写接口的抽象方法;当Animal是一个类时,
//此时匿名内部类和Animal之间是继承关系(extends),Animal的方法,匿名内部类可以选择重写或不重写;
@override
public void eat(Animal animal){
System.out.println(this.getName() + "吃了" + animal.getName());
}
});
}
//上面是实现接口的一个匿名内部类
//下面是继承一个只含有有参构造的父类的匿名内部类的写法
//2.
public class father{
//只含有有参构造的父类
public father(String name){
}
public void play(){
sout("fath");
}
public static void main(String args[]){
new father("son"){
};//此处需要加上son,因为父类没有无参构造,子类创建时需要先创建父类,所以此时就需要传入son,保证可以调用父类的有参构造;
}
}
++++++++第二种方式等同于下面的写法++++++
//3.
public class father{
public father(String name){
}
}
public class son extends father{
public son(String name){
super(name);
}
}
public class test{
public static void main(String args[]){
new son("name");
new father("name"){};//看似创建的时父类,其实创建的是继承父类的子类;所以前面两个在本质上是一样的;
//匿名内部类的好处之一就是可以减少类的一个创建;(同内部类)
//匿名内部类可用于函数式编程
}
}