匿名内部类【重点】
认识匿名内部类
- 匿名内部类就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。
格式:
new 类或接口(参数值...){
类体(一般是方法重写);};
new Animal(){ @Override public void cry(){ } };
- 特点: 匿名内部类本质就是一个子类,并会立即创建出一个子类对象。
- 作用:用于更方便的创建一个子类对象。
代码具体体现:
public class Test{ public static void main(String[] args){ Animal a = new Animal(){ @Override public void cry(){ System.out.println("喵喵喵地叫~"); } }; a.cry(); } } abstract class Animal{ public abstract void cry(); }
其效果相当于:
public class Test{ public static void main(String[] args){ Animal a = new Cat(); a.cry(); } } class Cat extends Animal{ @Override public void cry(){ System.out.println("喵喵喵地叫~"); } } abstract class Animal{ public abstract void cry(); }
匿名内部类的应用场景
- 通常作为一个参数传输给方法
案例演示:
需求:猫、狗参加游泳比赛。
先创建接口,因为是游泳比赛,接口让猫和狗都要去重写他们各自的方法。
public interface Swimming{ void swim(); }
再设计一个方法,可以接收Swimming接口的一切实现类对象进来参加游泳比赛。
public static void go(Swimming s){ System.out.println("开始--------------"); s.swim(); }
最后就可以开始实现了
public class Tset{ public static void main(String[] args){ go(); //这里要传参数,而且参数的类型是接口对象 //所以此时可以直接用匿名内部类作为参数传入。 go(new Swimming(){ @Override public void swim(){ System.out.println("狗游泳游得飞快"); } }); } }
没有直接作为参数传输给方法的话,是这样的:
public class Tset{ public static void main(String[] args){ Swimming s1 = new Swimming(){ @Override public void swim(){ System.out.println("狗游泳游得飞快"); }; go(s1); } }
匿名内部类大部分时候不是主动去用,而是被动去用的,需要用的时候才用的;一般是调用别人的API时,需要给一个对象,而这个对象正好是接口类型的,那么就知道此时要用匿名内部类了。
1、匿名内部类的书写格式是什么样的?
new 类或接口(参数值...){
类体(一般是方法重写);
};
(注意要写分号)
new Animal(){ @Override public void cry(){ } };
2、匿名内部类有啥特点?
- 匿名内部类本质就是一个子类,并会立即创建出一个子类对象
3、匿名内部类有啥作用、应用场景?
- 可以更方便的创建出一个子类对象。
- 匿名内部类通常作为一个参数传输给方法。
END