面试题答案
一键面试1. 抽象类实现多态
- 向上转型:子类对象可以赋值给抽象类类型的变量,实现向上转型。例如,定义一个抽象类
Shape
,子类Circle
继承自Shape
,Shape s = new Circle();
这种方式将Circle
对象向上转型为Shape
类型,体现了多态性。 - 方法重写规则:子类必须重写抽象类中的抽象方法(除非子类也是抽象类)。重写时方法的签名(方法名、参数列表、返回类型)必须与抽象类中的抽象方法一致,且访问修饰符不能比抽象类中更严格。例如,抽象类
Shape
中有抽象方法void draw();
,Circle
子类必须实现public void draw()
。 - 动态绑定:在运行时,根据对象的实际类型来决定调用哪个子类重写后的方法。如上述
Shape s = new Circle();
,当调用s.draw()
时,实际调用的是Circle
类重写的draw
方法,这就是动态绑定。
2. 接口实现多态
- 向上转型:实现接口的类的对象可以赋值给接口类型的变量,实现向上转型。例如,定义接口
Drawable
,类Rectangle
实现Drawable
接口,Drawable d = new Rectangle();
,将Rectangle
对象向上转型为Drawable
类型。 - 方法重写规则:实现接口的类必须实现接口中定义的所有方法。方法签名同样要一致,访问修饰符必须为
public
,因为接口中的方法默认是public abstract
的。例如,接口Drawable
中有方法void draw();
,Rectangle
类必须实现public void draw()
。 - 动态绑定:和抽象类类似,在运行时根据对象实际类型决定调用实现类中重写的方法。如
Drawable d = new Rectangle(); d.draw();
,实际调用Rectangle
类重写的draw
方法。
3. 两者差异
- 向上转型:抽象类向上转型基于继承关系,接口向上转型基于实现关系。继承是“is - a”关系,而实现是“like - a”关系。
- 方法重写规则:抽象类中的抽象方法可以有默认的访问修饰符(如
protected
),而接口方法默认是public abstract
,实现类必须用public
重写。抽象类还可以有非抽象方法,子类可选择重写;接口中所有方法都是抽象的。 - 动态绑定:原理相同,但抽象类可能存在继承体系中的多层重写和复杂的方法调用逻辑;接口由于其特性,实现类相对更独立,动态绑定逻辑相对更清晰。
4. 实际项目应用
- 利用抽象类:在图形绘制项目中,若存在一些图形共有的属性和部分通用的行为逻辑,可以将这些抽取到抽象类
Shape
中,如颜色属性和获取面积的通用计算逻辑(部分图形可通用)。不同图形子类继承Shape
,通过向上转型将不同图形对象统一处理,在绘制图形的场景中,调用draw
方法实现多态,这样代码结构清晰,便于维护和扩展新图形。 - 利用接口:在电商系统中,定义
Payable
接口,不同支付方式类(如AliPay
、WeChatPay
)实现该接口。在订单支付模块,通过接口类型的变量接受不同支付方式对象,实现支付操作的多态。这种方式使得添加新的支付方式时,只需实现Payable
接口,不影响其他支付相关代码,提高了代码的灵活性和可维护性。同时,接口更适用于实现多继承的功能,如一个类可实现多个接口,在不同业务场景复用接口方法,增强代码复用性。