
文章目录 今日学习目标一、 为什么需要接口二、接口概述2.1 接口的定义2.2 接口、类之间的关系三、接口、抽象类和多态四、 综合案例 今日学习目标理解接口存在的意义掌握接口的定义语法包括其成员变量、成员方法的特点。理清接口、类、抽象类三者之间的关系。深入对比抽象类与接口理解它们各自的设计意图和使用场景。能够通过实际案例综合运用抽象类和接口进行程序设计。一、 为什么需要接口 想象一下我们有三个类兔子、青蛙 和 狗。兔子类会吃饭()、喝水()青蛙类会吃饭()、喝水()、游泳()狗类会吃饭()、喝水()、游泳()你会如何设计提取共同点设计一个父类 动物类 包含 吃饭() 和 喝水() 方法。因为所有动物都需要吃饭和喝水。❓问题那么游泳() 方法能否也放在 动物类 父类中呢答案是否定的。因为并非所有动物都会游泳比如兔子如果强行放入兔子类在继承后就会获得一个它不应该拥有的“游泳”能力这不符合现实逻辑。现有方案的局限如果我们将游泳()这个方法各自写在青蛙和狗类中虽然能解决问题但会带来新的挑战如何使用多态我们无法用一个统一的类型来操作所有会游泳的动物。如何统一规范不同的程序员可能会写出swim()、swimming()、doSwim()等不同的方法名造成混乱。接口完美的解决方案接口可以定义一组行为规范“能做什么”而不关心具体的实现细节。我们可以定义一个游泳接口它只声明“会游泳”这个行为。然后让青蛙类和狗类去实现这个接口并根据自身特点来具体实现游泳()方法。这样我们就可以利用多态通过接口引用来调用游泳()方法产生不同的行为。二、接口概述2.1 接口的定义接口使用关键字interface来定义。它定义了一套行为规范有以下几个特点成员变量只能是常量默认修饰符public static final可以省略不写。为什么static让变量归属于接口由所有实现类共享避免了像C中“菱形继承”可能带来的问题。final保证常量的不可变性提供一组公共、统一的规范值。存在意义即使没有构造函数这些常量也有意义。它们为所有实现类提供了可直接使用的、统一的配置或标识避免了重复定义方便统一管理。final 知识点final 表示“不可变”。final 修饰类该类不能被继承。final 修饰方法该方法不能被重写。final 修饰变量基本数据类型变量的值不能被修改。引用数据类型变量的地址值不能被修改即不能再指向其他对象但对象内部的内容可以改变。构造方法没有原因接口不能被实例化它的核心是定义行为规则而不是创建对象。成员方法在JDK 8之前只能是抽象方法。默认修饰符public abstract可以省略不写。多态的根源正是由于接口方法的抽象性我们才能通过接口引用指向不同实现类的对象调用时产生不同的行为这是多态的基础。实例化接口不能被实例化实现关系接口和类是实现关系通过 implements 关键字表示。实现类必须重写接口中的全部抽象方法。包括接口的父类中的抽象方法如果实现类是抽象类则可以选择不重写。2.2 接口、类之间的关系类和类继承关系使用 extends。Java中是单继承但支持多层继承。类和接口实现关系使用 implements。Java支持单实现也支持多实现一个类可以实现多个接口。一个类还可以在继承一个父类的同时实现多个接口。接口和接口继承关系使用 extends。可以单继承也可以多继承。 思考小场景如果一个类实现了多个接口而这些接口中存在相同的抽象方法会发生什么答案类在实现时只需要重写这个方法一次这一次重写就同时满足了多个接口重写的要求。三、接口、抽象类和多态多态的实现基础抽象类和接口都是实现多态的重要基础。多态成立必须存在继承extends或实现implements关系。抽象类的多态继承 重写 父类引用指向子类对象。接口的多态实现 重写 接口引用指向实现类对象。抽象类vs接口对比维度抽象类 (Abstract Class)接口 (Interface)定义关键字abstract classinterface成员变量可以有各种类型的字段实例/静态final/非final任意访问修饰符只能有public static final常量隐式构造方法可以有供子类调用用于初始化父类字段不能有抽象方法使用abstract关键字声明子类必须实现除非子类也是抽象类默认就是public abstract可省略实现类必须实现除非实现类是抽象类具体方法可以有有方法体任意访问修饰符JDK 8后可以有default和static方法但传统上不包含实例具体方法访问修饰符方法public、protected、包级私有、private变量任意修饰符方法隐式publicdefault/static方法也是public变量只能是public实例化不能子类要么重写全部抽象方法要么是抽象类不能实现类要么重写全部抽象方法要么是抽象类继承/实现限制单继承多实现多态使用方式抽象类引用指向子类对象调用重写的方法接口引用指向实现类对象调用实现的方法设计意图语义“is-a”关系子类是父类的一种特殊化 强调本质归属和代码复用回答“它是什么”。“can-do”关系实现类具备某种能力 强调行为契约和多角色组合回答“它能做什么”。抽象类抽象的是“事物的本质”是对一类事物共同特征的提炼它回答的是 “它是什么”。父类拥有的变量和方法子类一定拥有强调子类是父类的一种。接口抽象的是“事物的能力”。是对一种行为或角色的规范它回答的是 “它能做什么”。用来表达跨类别的共同能力多个不同的类的共同的能力。例如“会飞”既可以应用于鸟也可以应用于飞机、超人。四、 综合案例场景我们需要设计一个体育管理系统涉及以下四种角色乒乓球运动员有姓名、年龄会学打乒乓球会说英语。篮球运动员有姓名、年龄会学打篮球。乒乓球教练有姓名、年龄会教打乒乓球会说英语。篮球教练有姓名、年龄会教打篮球。设计步骤提取共性“是什么”所有角色都是“人”有共同的属性姓名、年龄→ 创建一个父类 Person封装这些共有属性和构造方法。区分角色类型“是什么”的细化角色可以细分为“运动员”和“教练”。他们有各自独特的行为“学习” vs “教授”。→ 创建两个抽象类 Athlete 和 Coach分别继承 Person。在 Athlete 中声明抽象方法 learn()在 Coach 中声明抽象方法 teach()。这样所有运动员都必须实现自己的learn()方式所有教练都必须实现自己的teach()方式。处理附加能力“能做什么”“说英语”这个能力只有乒乓球相关的角色运动员和教练需要篮球相关的不需要。这是一种跨类别运动员和教练的附加能力。→ 创建一个接口 EnglishSpeakable在其中定义 speakEnglish() 方法。然后让PingPongAthlete和PingPongCoach类去实现这个接口而BasketballAthlete和BasketballCoach则不需要。以上为个人学习总结旨在梳理个人理解。如有疏漏或不当之处欢迎指正与交流。