Java中继承解决“是什么”,接口解决“能做什么”;类可单继承但多实现接口,结合使用实现灵活扩展与多态,抽象类+接口组合建模更合理,优先用组合与接口避免继承滥用。

Java里继承和接口不是孤立概念,它们常配合使用来构建灵活、可扩展的结构。关键在于:继承解决“是什么”的问题(比如学生是人),接口解决“能做什么”的问题(比如能拍照、能游泳)。两者结合,才能真正体现面向对象的设计意图。
用继承统一身份,用接口定义能力
一个类可以只继承一个父类,但能同时实现多个接口。这正好弥补了单继承的限制。
- 父类(如Animal)封装共性属性(name、age)和基础行为(eat、sleep)
- 接口(如IRun、IFly、ISwim)只声明能力契约,不关心谁来实现
- 子类(如Duck)既继承Animal获得身份和基础行为,又实现三个接口获得全部能力
- 另一个子类(如Frog)继承Animal,但只实现IRun和ISwim——它不会飞,代码上自然就不强制要求fly()方法
多态落地靠的是接口引用或父类引用
不是为了写得 fancy,而是为了让调用方不用关心具体类型。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 方法参数声明为IRun,就能传入Dog、Duck、Frog任何实现了该接口的对象
- 调用running(new Duck(...))时,实际执行的是Duck里重写的run()方法
- 同理,用Animal类型变量接收不同子类实例,调用eat()会自动触发各自重写的版本
- 这种写法让新增动物(比如Penguin)只需继承Animal + 实现对应接口,原有运行逻辑完全不用改
抽象类+接口组合更贴近真实建模
当既有共性逻辑又有能力契约时,抽象类比普通父类更合适。
立即学习“Java免费学习笔记(深入)”;
- 抽象类Feature可以包含部分实现(比如通用的价格计算逻辑),也能定义抽象方法(getInfo()必须由子类决定)
- 接口Function专注行为规范(takePicture、viewing),与具体实现解耦
- 子类Camera继承Feature,保证价格和名称管理一致;同时实现Function,明确它具备哪些功能
- 后续加个Drone类,也可以继承Feature并实现Function甚至新增IHover接口,不影响现有体系
避免继承滥用,优先考虑组合与接口
不是所有“有关系”都该用继承。比如Point3D继承Point看似合理,实则埋下隐患。
- Point的equals只比x/y,Point3D重写后要多比z,但父类方法仍可能被意外调用,导致逻辑不一致
- 更好的方式是让Point3D持有Point对象(组合),再通过接口(如Locatable)统一坐标操作行为
- 接口不涉及状态继承,只约束行为,天然规避了父类状态污染子类的风险
- 当两个类之间不是严格的“is-a”,而是“has-a”或“can-do”,优先选接口或组合

















