匿名内部类和普通的内部类的理解相似,本质上是类,特殊的是匿名内部类只使用一次,当业务中存在这种需求时可以是用匿名内部类,并且其广泛使用在函数式编程中;匿名内部类支持在定义这个类时就会创建一个对象;

//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"){};//看似创建的时父类,其实创建的是继承父类的子类;所以前面两个在本质上是一样的;
        //匿名内部类的好处之一就是可以减少类的一个创建;(同内部类)
        //匿名内部类可用于函数式编程
    }

}