为什么函数式接口 Comparator 中有 “两个抽象方法”?

这两天在重写排序规则时发现 Comparator 中有 “两个抽象方法”,即 compareequals。这令我十分费解,函数式接口不是只能一个抽象方法吗?(具体方法、default 方法不算在内)

在这里插入图片描述

直到看到 @FunctionalInterface 的 JDK 文档注释 才解决了我的疑惑。

在这里插入图片描述

  • 如果一个接口中声明的抽象方法是重写了超类 Object 类中任意一个 public 方法,那么这些抽象方法并不会算入接口的抽象方法数量中。因为任何接口的实现都会从其父类 Object 或其它地方获得这些方法的实现。

    • 接口也继承了 Object,所以在接口中定义 equals 方法本质上是对 Object 的重写(抽象重写具体)。
    • 如果一个类同时继承父类,并且实现接口,且它们有重名方法,此时采用超类优先

    在这里插入图片描述

/**
 * @Author: posper
 * @Date: 2022/07/20 15:49
 */
public class Test {
	public static void main(String[] args) {
		Animal dog = new Dog();
		// 超类优先,所以这里调用的是父类 Animal 中的 run() 方法
		dog.run();
	}
}

// 验证“超类优先原则”,见 main() 中 dog.run() 方法.
class Dog extends Animal implements Run {
	int age;
	String name;
}

// 接口
@FunctionalInterface
interface Run {
	void run();

	// 这里类比 Comparator 中的 equals,`@FunctionalInterface` 不会将其不算作抽象方法
	@Override
	boolean equals(Object o);
}

// 父类
class Animal {
	public void run() {
		System.out.println("调用Animal的run()方法");
	}
}

// 验证“抽象重写具体”
abstract class Cat extends Animal {
	// 抽象重写具体方法,可以是可以但是感觉没啥必要...
	@Override
	public abstract void run();
}

运行结果:
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值