15 抽象类与接口

发布时间:2026/6/4 14:27:51

15 抽象类与接口 目录 15 抽象类与接口 目录15.1 为什么需要抽象类15.2 抽象类的定义与使用15.2.1 语法15.2.2 示例15.2.3 抽象类的特点15.3 抽象方法15.3.1 语法15.3.2 子类实现抽象方法15.3.3 抽象类的模板方法模式15.4 为什么需要接口15.5 接口的定义与实现15.5.1 接口的定义15.5.2 示例USB接口15.5.3 实现接口15.5.4 接口的特点15.6 多实现15.6.1 一个类实现多个接口15.6.2 接口继承接口15.6.3 类同时继承和实现15.7 接口vs抽象类15.8 JDK8接口新特性15.8.1 默认方法default15.8.2 静态方法static15.8.3 JDK8特性总结15.9 综合案例支付系统设计设计思路15.10 本章总结知识回顾经典面试题 互动时间 参考资料 15 抽象类与接口更新日期2026年5月版权声明本文为原创内容转载请注明出处。系列Java入门到精通系列 · 第二阶段 · 面向对象 目录15.1 为什么需要抽象类15.2 抽象类的定义与使用15.3 抽象方法15.4 为什么需要接口15.5 接口的定义与实现15.6 多实现15.7 接口vs抽象类15.8 JDK8接口新特性15.9 综合案例支付系统设计15.10 本章总结15.1 为什么需要抽象类在设计Animal类时叫这个行为在父类中无法给出具体实现——不同动物叫声不同。但我们又希望所有动物都有这个行为规范。publicclassAnimal{publicvoidspeak(){// 这里写什么狗叫猫叫什么都不对}}解决方案用abstract将方法定义为抽象方法不写方法体强制子类去实现。15.2 抽象类的定义与使用15.2.1 语法publicabstractclass类名{// 普通成员变量// 普通成员方法可以有方法体// 抽象方法没有方法体子类必须实现}15.2.2 示例publicabstractclassAnimal{protectedStringname;publicAnimal(Stringname){this.namename;}// 普通方法有方法体publicvoideat(){System.out.println(name正在吃东西);}// 抽象方法没有方法体publicabstractvoidspeak();}15.2.3 抽象类的特点特点说明不能实例化new Animal()❌ 编译错误可以有构造方法供子类调用super()可以有普通方法子类直接继承使用可以有抽象方法子类必须重写实现子类必须实现所有抽象方法否则子类也必须声明为abstract15.3 抽象方法15.3.1 语法publicabstract返回值类型 方法名(参数列表);// 没有方法体以分号结束15.3.2 子类实现抽象方法publicclassDogextendsAnimal{publicDog(Stringname){super(name);}Overridepublicvoidspeak(){System.out.println(name汪汪汪);}}publicclassCatextendsAnimal{publicCat(Stringname){super(name);}Overridepublicvoidspeak(){System.out.println(name喵喵喵~);}}publicclassAnimalTest{publicstaticvoidmain(String[]args){// Animal a new Animal(动物); // ❌ 不能实例化AnimaldognewDog(旺财);AnimalcatnewCat(咪咪);dog.eat();// 普通方法继承自Animaldog.speak();// 旺财汪汪汪重写后的方法cat.eat();cat.speak();// 咪咪喵喵喵~}}15.3.3 抽象类的模板方法模式publicabstractclassGame{// 模板方法定义算法骨架publicfinalvoidplay(){initialize();startPlay();endPlay();}abstractvoidinitialize();abstractvoidstartPlay();abstractvoidendPlay();}publicclassFootballextendsGame{Overridevoidinitialize(){System.out.println(足球比赛球员入场);}OverridevoidstartPlay(){System.out.println(足球比赛开始比赛);}OverridevoidendPlay(){System.out.println(足球比赛比赛结束颁奖);}}15.4 为什么需要接口抽象类只能单继承Java不支持多继承。但有时一个类需要具备多种能力手机既是通讯工具又是相机还是音乐播放器一个学生既是学生又是志愿者接口Interface解决了这个问题一个类可以实现多个接口。15.5 接口的定义与实现15.5.1 接口的定义publicinterface接口名{// 常量public static final// 抽象方法public abstract// 默认方法JDK8default// 静态方法JDK8static}15.5.2 示例USB接口publicinterfaceUSB{// 接口中的变量默认是 public static finalStringTYPEUSB;// 接口中的方法默认是 public abstractvoidopen();voidclose();}15.5.3 实现接口publicclassKeyboardimplementsUSB{Overridepublicvoidopen(){System.out.println(键盘已连接);}Overridepublicvoidclose(){System.out.println(键盘已断开);}}publicclassMouseimplementsUSB{Overridepublicvoidopen(){System.out.println(鼠标已连接);}Overridepublicvoidclose(){System.out.println(鼠标已断开);}}15.5.4 接口的特点特点说明不能实例化new USB()❌方法默认 public abstract可以省略不写变量默认 public static final即常量类用implements实现接口实现所有抽象方法没有构造方法不能有构造方法15.6 多实现15.6.1 一个类实现多个接口publicinterfaceFlyable{voidfly();}publicinterfaceSwimmable{voidswim();}publicinterfaceRunnable{voidrun();}publicclassDuckimplementsFlyable,Swimmable,Runnable{Overridepublicvoidfly(){System.out.println(鸭子在飞);}Overridepublicvoidswim(){System.out.println(鸭子在游泳);}Overridepublicvoidrun(){System.out.println(鸭子在跑);}}15.6.2 接口继承接口publicinterfaceAnimal{voideat();voidsleep();}publicinterfacePetextendsAnimal{voidplay();// Pet接口包含eat() sleep() play()}15.6.3 类同时继承和实现publicclassDogextendsAnimalimplementsPet,Runnable{// 必须实现Pet和Runnable中的所有方法// 以及Pet继承自Animal的方法}15.7 接口vs抽象类对比维度抽象类接口关键字abstract classinterface继承/实现单继承extends多实现implements构造方法有没有成员变量可以有普通变量只能有常量public static final方法可以有普通方法和抽象方法默认抽象方法JDK8可有默认方法设计理念is-a 关系has-a 能力/行为代码复用可以不能JDK8默认方法有限复用设计原则如果描述的是一种是什么 → 抽象类Dog is an Animal 如果描述的是一种能做什么 → 接口Dog can Run15.8 JDK8接口新特性15.8.1 默认方法defaultpublicinterfaceVehicle{voidstart();// 默认方法有方法体实现类可以选择重写defaultvoidhonk(){System.out.println(滴滴);}}publicclassCarimplementsVehicle{Overridepublicvoidstart(){System.out.println(汽车启动);}// 可以选择不重写honk()直接使用默认实现}CarcarnewCar();car.start();// 汽车启动car.honk();// 滴滴使用接口默认方法15.8.2 静态方法staticpublicinterfaceMathUtil{staticintadd(inta,intb){returnab;}staticintmultiply(inta,intb){returna*b;}}// 通过接口名直接调用intresultMathUtil.add(3,5);// 815.8.3 JDK8特性总结特性语法说明抽象方法void method()实现类必须重写默认方法default void method() {}实现类可选重写静态方法static void method() {}通过接口名调用私有方法private void method() {}JDK9接口内部使用15.9 综合案例支付系统设计设计思路接口层 ├── Payable支付能力 ├── Refundable退款能力 └── Transferable转账能力 实现层 ├── WeChatPay implements Payable, Refundable ├── AliPay implements Payable, Refundable, Transferable └── BankCard implements Payable, Transferable// 支付接口publicinterfacePayable{booleanpay(doubleamount);StringgetPayType();}// 退款接口publicinterfaceRefundable{booleanrefund(doubleamount);}// 转账接口publicinterfaceTransferable{booleantransfer(StringtoAccount,doubleamount);}// 微信支付publicclassWeChatPayimplementsPayable,Refundable{privateStringopenId;privatedoublebalance;publicWeChatPay(StringopenId,doublebalance){this.openIdopenId;this.balancebalance;}Overridepublicbooleanpay(doubleamount){if(balanceamount){balance-amount;System.out.println(微信支付成功amount元剩余balance元);returntrue;}System.out.println(微信余额不足);returnfalse;}OverridepublicStringgetPayType(){return微信支付;}Overridepublicbooleanrefund(doubleamount){balanceamount;System.out.println(微信退款成功amount元余额balance元);returntrue;}}// 支付宝publicclassAliPayimplementsPayable,Refundable,Transferable{privateStringuserId;privatedoublebalance;publicAliPay(StringuserId,doublebalance){this.userIduserId;this.balancebalance;}Overridepublicbooleanpay(doubleamount){if(balanceamount){balance-amount;System.out.println(支付宝支付成功amount元);returntrue;}System.out.println(支付宝余额不足);returnfalse;}OverridepublicStringgetPayType(){return支付宝;}Overridepublicbooleanrefund(doubleamount){balanceamount;System.out.println(支付宝退款成功amount元);returntrue;}Overridepublicbooleantransfer(StringtoAccount,doubleamount){if(balanceamount){balance-amount;System.out.println(转账给toAccountamount元);returntrue;}System.out.println(转账失败余额不足);returnfalse;}}// 测试publicclassPayTest{publicstaticvoidmain(String[]args){WeChatPaywechatnewWeChatPay(wx_001,1000);AliPayalinewAliPay(ali_001,2000);// 统一使用Payable接口pay(wechat,299.99);pay(ali,599.00);// 退款功能只支持Refundable接口的对象if(wechatinstanceofRefundable){((Refundable)wechat).refund(100);}// 转账功能if(aliinstanceofTransferable){((Transferable)ali).transfer(wx_002,500);}}// 多态统一的支付方法publicstaticvoidpay(Payablepayable,doubleamount){System.out.println(使用payable.getPayType()支付...);payable.pay(amount);}}15.10 本章总结知识回顾知识点核心内容抽象类用abstract修饰不能实例化可以有抽象方法和普通方法抽象方法没有方法体子类必须实现接口用interface定义用implements实现多实现一个类可以实现多个接口接口vs抽象类is-a用抽象类has-a用接口默认方法JDK8default修饰有方法体经典面试题Q接口和抽象类有什么区别什么时候用接口什么时候用抽象类A接口定义行为规范“能做什么”支持多实现抽象类定义公共代码“是什么”只能单继承。当需要定义一组行为能力时用接口当需要提供公共实现和定义模板时用抽象类。 互动时间接口中的default方法解决了什么问题为什么Java不支持多继承但支持多实现下篇预告[16-内部类与常用API]—— 学习内部类的多种形态和String/StringBuilder的使用 参考资料Oracle Java 官方文档 - InterfacesOracle Java 官方文档 - Abstract Methods and Classes《Effective Java》第3版第20-22条

相关新闻