匿名内部类是定义在外部类的局部位置,比如方法中,并且没有类名。

  • 本质是一个类
  • 内部类
  • 该类没有名字
  • 同时还是一个对象
  1. 匿名内部类的基本语法

    new 类或接口(参数列表){ 类体 };

基于接口的匿名内部类

  1. package test;
  2. /**
  3. * 演示匿名内部类的使用
  4. */
  5. public class Main {//外部其他类
  6. public static void main(String[] args) {
  7. Outer Outer = new Outer();
  8. Outer.method();
  9. }
  10. }
  11. class Outer { //外部类
  12. private int n1 = 10;//属性
  13. public void method() {//方法
  14. //1.需求: 想使用IA接口,并创建对象
  15. //2.传统方式,是写一个类,实现该接口,并创建对象
  16. //3.这里需求是 Tiger/Dog 类只是使用一次,后面再不使用
  17. //4. 可以使用匿名内部类来简化开发
  18. //5. tiger的编译类型 ? IA(接口)
  19. //6. tiger的运行类型 ? 就是匿名内部类 Outer$1
  20. /*
  21. 我们看底层 会分配 类名 Outer$1(系统自动分配)
  22. class Outer$1 implements IA {
  23. @Override
  24. public void cry() {
  25. System.out.println("老虎叫唤...");
  26. }
  27. }
  28. */
  29. //传统方式
  30. // IA tiger = new Tiger();
  31. // tiger.cry();
  32. //7. jdk底层在创建匿名内部类 Outer$1,立即马上就创建了 Outer$1实例,
  33. // 并且把地址返回给 tiger
  34. //8. 匿名内部类使用一次,就不能再使用
  35. //基于接口的匿名内部类
  36. IA tiger = new IA(){//tiger接收之后可以反复调用
  37. @Override
  38. public void cry() {
  39. System.out.println("老虎叫唤...");
  40. }
  41. };
  42. System.out.println("tiger的运行类型=" + tiger.getClass());
  43. tiger.cry();
  44. tiger.cry();
  45. tiger.cry();
  46. }
  47. }
  48. interface IA {//接口
  49. public void cry();
  50. }
  51. //传统写法
  52. //class Tiger implements IA {
  53. //
  54. // @Override
  55. // public void cry() {
  56. // System.out.println("老虎叫唤...");
  57. // }
  58. //}
  59. //class Dog implements IA{
  60. // @Override
  61. // public void cry() {
  62. // System.out.println("小狗汪汪...");
  63. // }
  64. //}

image.png

基于类的匿名内部类

  1. package test;
  2. /**
  3. * 演示匿名内部类的使用
  4. */
  5. public class Main {//外部其他类
  6. public static void main(String[] args) {
  7. Outer Outer = new Outer();
  8. Outer.method();
  9. }
  10. }
  11. class Outer { //外部类
  12. private int n1 = 10;//属性
  13. public void method() {//方法
  14. //分析
  15. //1. father编译类型 Father
  16. //2. father运行类型 Outer$1
  17. //3. 底层会创建匿名内部类
  18. /*
  19. class Outer$1 extends Father{
  20. @Override
  21. public void test() {
  22. System.out.println("匿名内部类重写了test方法");
  23. }
  24. }
  25. */
  26. //4. 同时也直接返回了 匿名内部类 Outer$1的对象
  27. //5. 注意("WTY2002") 参数列表会传递给 构造器
  28. //基于类的匿名内部类
  29. Father father = new Father("WTY2002"){
  30. //可以选择性的重写test方法
  31. //因为Father不是抽象类
  32. @Override
  33. public void test(){
  34. System.out.println("匿名内部类重写了test方法");
  35. }
  36. };
  37. System.out.println("father对象的运行类型=" + father.getClass());//Outer$1
  38. father.test();
  39. //基于抽象类的匿名内部类
  40. Animal animal = new Animal(){
  41. //此处必须实现抽象方法
  42. @Override
  43. void eat() {
  44. System.out.println("小狗吃骨头...(匿名内部类重写了抽象类中的方法)");
  45. }
  46. };
  47. animal.eat();
  48. }
  49. }
  50. class Father {//类
  51. public Father(String name) {//构造器
  52. System.out.println("接收到name=" + name);
  53. }
  54. public void test() {//方法
  55. }
  56. }
  57. abstract class Animal { //抽象类
  58. abstract void eat();
  59. }

image.png