匿名内部类
警告:匿名内部类本质上是一个对象
如果有一个接口或者抽象类,必须要用class定义一个实现类写重写抽象方法,才能创建对象并使用。
匿名内部类就是省略了用class定义子类的过程,直接使用父类或者接口创建子类对象
1 //动物类 2 public abstract class Animal{ 3 public void eat(); 4 } 5 //饲养员类 6 public class Feeder{ 7 public void feed(Animal a){ 8 a.eat(); 9 } 10 } 11 //测试类 12 public class Demo4{ 13 public static void main(String[] args){ 14 //创建饲养员对象 15 Feeder f=new Feeder(); 16 //饲养员养一个动物 17 f.feed(new Animal(){ 18 public void eat(){ 19 System.out.println("狗吃骨头"); 20 } 21 }); 22 //饲养员养另一个动物 23 f.feed(new Animal(){ 24 public void eat(){ 25 System.out.println("猫吃鱼"); 26 } 27 }); 28 } 29 }
接口回调
1 2 //定义技能的接口 3 public interface Skill { 4 public void useSkill(); //释放技能 5 } 6 //英雄类 7 public class Hero { 8 private String name;//英雄的姓名 9 private Skill skill;//英雄的技能 10 //设置技能 11 public void setSkill(Skill skill) { 12 this.skill = skill; 13 } 14 //开始玩 15 public void play(){ 16 skill.useSkill(); //这里执行的是具体技能的复写方法 17 } 18 } 19 //测试类 20 public class Demo4 { 21 public static void main(String[] args) { 22 //创建英雄对象 23 Hero hero=new Hero(); 24 //给英雄设置技能 25 hero.setSkill(new Skill() { 26 @Override 27 public void useSkill() { 28 System.out.println("拱墙,拱砖...变大...踩鸭子"); 29 } 30 }); 31 //让英雄使用技能 32 hero.play(); 33 } 34 }
下面是代码调用的流程,注意箭头的指向