面试题答案
一键面试类继承和接口继承在方法重写方面的不同点
- 访问修饰符规则:
- 类继承:在类继承中,重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果父类方法是
protected
,子类重写该方法时可以是protected
或public
,但不能是private
。这是为了确保子类对象在使用时能保持与父类对象一致的行为可见性。 - 接口继承:接口中的方法默认是
public
的,实现接口的类重写接口方法时必须使用public
修饰符。因为接口定义的是一种契约,实现类必须保证这些方法对外部是公开可访问的,以符合接口所定义的行为规范。
- 类继承:在类继承中,重写方法的访问修饰符不能比被重写方法的访问修饰符更严格。例如,如果父类方法是
- 方法实现:
- 类继承:父类方法通常有具体实现,子类重写方法时可以根据需求修改实现逻辑,但要保持方法签名一致(方法名、参数列表、返回类型)。在Java 5.0及之后,返回类型可以是被重写方法返回类型的子类型(协变返回类型)。
- 接口继承:接口中的方法默认是抽象的(Java 8之前),没有方法体。实现接口的类必须为接口中的所有抽象方法提供具体实现。从Java 8开始,接口可以有默认方法和静态方法。
接口默认方法和静态方法在接口继承体系中的作用和重写规则
- 默认方法:
- 作用:默认方法为接口提供了一种向后兼容的机制。在不破坏现有实现类的前提下,可以为接口添加新的方法。例如,
java.util.List
接口在Java 8中添加了sort
默认方法,现有的ArrayList
、LinkedList
等实现类无需显式实现sort
方法就能使用该功能。 - 重写规则:实现类可以选择重写接口的默认方法。如果一个类实现了多个接口,而这些接口中有相同签名的默认方法,那么该类必须重写这个默认方法,以消除冲突。同时,子类重写默认方法时遵循与类继承中方法重写相同的访问修饰符规则(不能更严格)。
- 作用:默认方法为接口提供了一种向后兼容的机制。在不破坏现有实现类的前提下,可以为接口添加新的方法。例如,
- 静态方法:
- 作用:接口的静态方法提供了一种与接口相关但不依赖于接口实现类实例的工具方法。例如,
java.util.Comparator
接口中的comparing
静态方法,用于创建一个比较器。它使得接口可以像类一样拥有一些工具性的静态操作,而不需要创建实例。 - 重写规则:接口的静态方法不能被重写。因为静态方法属于接口本身,而不是接口的实例,不存在在实现类中重写的概念。实现类只能通过接口名来调用静态方法,例如
Comparator.comparing(...)
。
- 作用:接口的静态方法提供了一种与接口相关但不依赖于接口实现类实例的工具方法。例如,