1. 匿名内部类语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有创建对象的特征。因此,匿名内部类有以下两种调用方式:

      //法一: new A(){
      @Override
      public void cry(){
      System.out.println(“hello~”);
      }
      }.cry();

      //法二: A a = new A(){
      @Override
      public void cry(){
      System.out.println(“hello~”);
      }
      };
      a.cry();

    1. package test;
    2. /**
    3. * 演示匿名内部类的使用
    4. */
    5. public class Main {//外部其他类
    6. public static void main(String[] args) {
    7. Outer Outer = new Outer();
    8. Outer.f1();
    9. System.out.println("main Outer hashcode=" + Outer);
    10. }
    11. }
    12. class Outer {
    13. private int n1 = 99;
    14. public void f1() {
    15. //创建一个基于类的匿名内部类
    16. //不能添加访问修饰符,因为它的地位就是一个局部变量
    17. //作用域 : 仅仅在定义它的方法或代码块中
    18. Person p = new Person(){
    19. private int n1 = 88;
    20. @Override
    21. public void hi() {
    22. //可以直接访问外部类的所有成员,包含私有的
    23. //如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,
    24. //默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.this.成员)去访问
    25. System.out.println("匿名内部类重写了 hi方法");
    26. System.out.println("n1 = " + n1 + " 外部内的n1=" + Outer.this.n1);
    27. //Outer.this 就是调用 f1的 对象
    28. System.out.println("Outer.this hashcode=" + Outer.this);
    29. }
    30. };
    31. p.hi();//动态绑定, 运行类型是 Outer$1
    32. //也可以直接调用, 匿名内部类本身也是返回对象
    33. // 底层:class 匿名内部类 extends Person {}
    34. new Person(){
    35. @Override
    36. public void hi() {
    37. System.out.println("匿名内部类重写了 hi方法,哈哈...");
    38. }
    39. @Override
    40. public void ok(String str) {
    41. super.ok(str);
    42. }
    43. }.ok("WTY2002");
    44. }
    45. }
    46. class Person {//类
    47. public void hi() {
    48. System.out.println("Person hi()");
    49. }
    50. public void ok(String str) {
    51. System.out.println("Person ok() " + str);
    52. }
    53. }
    54. //抽象类/接口...

    image.png