匿名内部类

内部类

在A类的内部中若存在一个B类,则B类为内部类,A类是B类的外部类。

publi class A {
  class B{
  // 内部类
  }
}

内部类可以调用外部类的方法和属性,外部类需通过创建内部类对象来调用内部类的方法和属性。

外部类.内部类 对象 = new 外部类().new 内部类();

匿名内部类

匿名内部类就是没有名字的内部类

当我们实现接口时,需要先定义子类、重写方法、创建子类对象然后调用子类重写后的方法

匿名内部类可以简化实现接口的步骤,可以快速的写出一个虚拟类的子类或者一个接口的实现类,所以其实本质创建一个类继承自父类,所以普通类也可以使用匿名内部类

匿名内部类实现条件

必须实现一个父接口或者继承父类。

new 父类或接口 {
  @Override
  public void 方法名() {
    代码块;
  }
}

使用例子

定义接口
public interface People {
  void eat();
}

实现匿名内部类

// 重写方法
new People() {
  @Override
  public void eat() {
    System.out.println("人需要吃饭。");
  }
}

//调用方法
new People() {
  @Overried
  public void eat() {
    System.out.println("人需要吃饭。");
  }
}.eat;

为匿名对象命名

People xiaoming = new People() {
  @Overried
  public void eat() {
    System.out.println("小明需要吃饭。");
  }
}
Xiaoming.eat(); // 通过命名调用。

将抽象类或接口作为参数

存在方法func

public static void func(People p) {
  p.eat();
}

接口作为参数

直接作为参数传递
func(new People() {
  @Override
  public void eat() {
    System.out.println("人需要吃饭。");
  }
})

// 也可以给匿名内部类命名,然后传入方法
People xiaoming = new People() {
  @Overried
  public void eat() {
    System.out.println("小明需要吃饭。");
  }
}
func(xiaoming);

抽象类作为参数:
同接口做参数

匿名内部类双大括号

例子

addOption(new HashMap<Integer,String>(){{
  put(1, "test");
  put(2, "work");
  }},quesId);

第一层括号表示定义了一个匿名内部类
第二层括号表示构造方法,因为该类没有名字。当执行时,改构造方法可以调用父类中的put函数进行初始化。

匿名内部类继承Object,里面自带equals方法,相当于重写了接口里的equals方法,同理,如果一个类实现多个接口,这些接口里又有相同的方法的话,只用重写一次就行了。

posted @   Instser  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示