抽象类 vs 接口:为什么选择它?
文章目录抽象类 vs 接口为什么选择它什么是抽象类抽象类的特点抽象类的示例什么是接口接口的特点接口的示例抽象类 vs 接口谁更适合你1. 多继承的支持2. 方法的实现3. 常量的使用4. 使用场景总结为什么选择抽象类场景一当你需要一种“半吊子专家”的感觉场景二当你想保持代码的“纯洁性”为什么选择接口场景一当你想让代码更灵活场景二当你想避免“继承地狱”常见的误区误区一接口只能用于“定义规范”误区二抽象类不能有构造器误区三接口中的变量必须是 final 的总结最后要记住的一点是在 Java 8 中接口已经不再是一个“只声明不定义”的存在了它也可以有默认方法和静态方法。这使得接口的使用场景更加广泛。 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把抽象类 vs 接口为什么选择它大家好我是闫工今天我们要聊一个 Java 面试中必考的话题——抽象类和接口的区别以及它们各自的适用场景。这个问题看似简单但其实深藏玄机稍不留神就容易踩坑。不过别担心闫工来帮你理清思路什么是抽象类抽象类Abstract Class是一个特殊的类它不能被实例化只能用来作为其他类的父类。Java 中用abstract关键字修饰一个类使其成为抽象类。抽象类的特点不能直接创建对象抽象类必须被继承不能直接使用new关键字创建它的实例。可以包含抽象方法和具体方法抽象类中可以有普通的方法具体方法也可以用abstract修饰符声明抽象方法。抽象方法没有具体的实现必须在子类中被重写。支持继承抽象类可以通过extends关键字被其他类继承。抽象类的示例// 定义一个抽象类 AnimalabstractclassAnimal{// 具体方法publicvoideat(){System.out.println(动物需要吃饭);}// 抽象方法abstractvoidmove();}// 继承自 Animal 的子类 DogclassDogextendsAnimal{Overridepublicvoidmove(){System.out.println(狗在奔跑);}}什么是接口接口Interface是 Java 中一种特殊的抽象类型它完全由方法签名和常量组成。接口中的所有方法默认都是public abstract的。接口的特点不能被实例化接口只能被实现不能直接创建对象。只能声明方法和常量接口中不能有具体的方法实现JDK 8 及以后支持默认方法和静态方法。多重继承的支持Java 中一个类可以实现多个接口从而实现“多重继承”的效果。接口的示例// 定义一个接口 ShapeinterfaceShape{// 抽象方法voiddraw();}// 实现 Shape 接口的类 CircleclassCircleimplementsShape{Overridepublicvoiddraw(){System.out.println(绘制圆形);}}抽象类 vs 接口谁更适合你1. 多继承的支持这是 Java 中一个非常重要的区别。抽象类只能支持单继承而接口可以实现多重继承。抽象类的限制classAextendsB{}// 正确// class C extends D, E {} // 错误Java 不允许多继承接口的优势interfaceI1{}interfaceI2{}classMyimplementsI1,I2{}// 正确可以实现多个接口2. 方法的实现抽象类中既可以有具体方法普通方法也可以有抽象方法。而接口在 Java 8 之前只能声明抽象方法从 Java 8 开始接口可以提供默认方法和静态方法。// 抽象类中的具体方法abstractclassAnimal{publicvoideat(){// 具体方法System.out.println(动物需要吃饭);}abstractvoidmove();}// 接口中的默认方法Java 8interfaceShape{defaultvoiddraw(){// 默认方法System.out.println(默认绘制形状);}}3. 常量的使用接口中可以声明常量这些常量必须是public static final的。而抽象类中也可以有常量但需要手动定义。// 接口中的常量interfaceMath{intPI314;}// 抽象类中的常量abstractclassConstants{publicstaticfinalintGRAVITY980;}4. 使用场景总结特性抽象类支持接口支持单继承是否只能通过实现多重继承不支持支持具体方法的定义是Java 8 支持默认方法常量的声明需要手动定义自动生成常量对已有类的扩展能力如果已有父类无法使用可以实现多个接口为什么选择抽象类场景一当你需要一种“半吊子专家”的感觉抽象类适合那些已经具备一些功能但还没有完全确定细节的场景。比如在设计一个动物类的时候我们可以把eat方法的具体实现写出来而move方法则由具体的动物来实现。abstractclassAnimal{// 具体方法所有动物都需要吃饭publicvoideat(){System.out.println(动物需要吃饭);}// 抽象方法不同的动物移动方式不同abstractvoidmove();}场景二当你想保持代码的“纯洁性”抽象类可以作为一个模板强制子类实现某些行为。比如定义一个Vehicle类要求所有车辆都必须有start()和stop()方法。abstractclassVehicle{abstractvoidstart();abstractvoidstop();// 具体方法通用的鸣笛功能publicvoidhonk(){System.out.println(滴滴);}}为什么选择接口场景一当你想让代码更灵活有时候我们需要一种“插件式”的设计允许不同的类实现相同的接口。比如定义一个Serializable接口任何需要序列化的类都可以实现它。interfaceSerializable{voidserialize();}classUserimplementsSerializable{Overridepublicvoidserialize(){// 实现用户序列化逻辑}}场景二当你想避免“继承地狱”多继承是 Java 的一大痛点而接口则完美地解决了这个问题。比如设计一个支付系统时我们可以让Payment类同时实现CardPayment和MobilePayment接口。interfaceCardPayment{voidpayWithCard();}interfaceMobilePayment{voidpayWithPhone();}classPaymentimplementsCardPayment,MobilePayment{OverridepublicvoidpayWithCard(){// 实现卡支付逻辑}OverridepublicvoidpayWithPhone(){// 实现手机支付逻辑}}常见的误区误区一接口只能用于“定义规范”其实接口的作用远不止于此。通过默认方法和静态方法接口可以成为功能模块的聚合点。interfaceMyInterface{defaultvoidmethod1(){System.out.println(我是默认方法);}staticvoidmethod2(){System.out.println(我是静态方法);}}误区二抽象类不能有构造器抽象类是可以定义构造器的只不过它们不能被直接实例化。abstractclassAnimal{// 抽象类的构造器publicAnimal(){System.out.println(动物诞生了);}abstractvoidmove();}classDogextendsAnimal{publicDog(){// 必须调用父类构造器super();System.out.println(小狗诞生了);}}误区三接口中的变量必须是 final 的实际上接口中的所有变量都是隐式的public static final。interfaceMath{intPI314;// 实际上是 public static final}总结抽象类和接口各有千秋选择的关键在于如果需要一种“模板式”的设计并且希望某些方法被具体实现那么抽象类更合适。如果需要灵活性和扩展性尤其是想支持多重继承那么接口是更好的选择。最后要记住的一点是在 Java 8 中接口已经不再是一个“只声明不定义”的存在了它也可以有默认方法和静态方法。这使得接口的使用场景更加广泛。 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把成体系的面试题无论你是大佬还是小白都需要一套JAVA体系的面试题我已经上岸了你也想上岸吗闫工精心准备了程序准备面试想系统提升技术实力闫工精心整理了1000 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 详细解析并附赠高频考点总结、简历模板、面经合集等实用资料✅ 覆盖大厂高频题型✅ 按知识点分类查漏补缺超方便✅ 持续更新助你拿下心仪 Offer免费领取 点击这里获取资料已帮助数千位开发者成功上岸下一个就是你✨
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414732.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!