2021.4.27:接口
在抽象类中,抽象方法的本质是定义接口规范:规定高层类的接口,保证所有子类都有相同的接口实现。这样,多态就能发挥出威力。
如果一个抽象类没有属性,所有方法都是抽象方法:
abstract class Person{ public abstract void run(); public abstract String getName(); }
就可以把该抽象class改写为接口interface。
声明
关键字:interface
interface Person{ void run(); String getName(); }
说明
- 所谓interface,是比抽象类还要抽象的纯抽象接口,因为它连属性都没有。
- 所有方法默认都是public abstract
- 当一个class去实现interface时,需要使用implements关键字,且必须实现所有抽象方法:
class Student implements Person{ private String name; public Student(String name){ this.name=name; } public void run(){ System.out.println(this.name+"run"); } public String getName(){ return this.name; } }
- 一个class不能继承自多个类,但却可以实现多个interface:
class Student implements Person,Hello{ ... }
接口继承
一个interface可以继承自另一个interface,关键字extends,相当于扩展了接口的方法。
interface Hello{ void hello(); } interface Person extends Hello{ void run(); String getName(); }
Person接口继承自Hello接口,因此,Person接口现在实际上有3个抽象方法。
之前我们讲过,可以定义抽象父类变量,来承接具体子类对象;在学了接口之后,我们可以更进一步,用接口变量,承接具体子类对象:
//Person是一个接口 //Student是实现了接口Person的类 //class Student implements Person Person p=new Student("Lee"); p.run();
以此实现了最高等级的多态。
default方法
default是接口特有的修饰符,用default修饰接口的某个方法,相当于在接口中实现了一些方法,这些方法就要用default修饰:
public class Main { public static void main(String[] args) { Person p=new Student("Lee"); p.run(); } } interface Person{ default void run(){ System.out.println(getName()+" run"); } String getName(); } class Student implements Person{ private String name; public Student(String name){ this.name=name; } public String getName(){ return this.name; } }
实现类可以不覆写default方法;default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要覆写新增方法。
default方法与抽象类的普通方法是不同的——因为接口没有属性,所以default方法无法访问属性,而抽象类的普通方法可以访问属性。
总结
- 接口:没有属性只有抽象方法,比抽象类还抽象的构件;由于所有方法都是抽象方法,所以抽象方法的前缀public abstract可以省去
- 用interface定义接口;某类实现接口时,用关键字implements
class A implements B{}
- 接口可以继承自其他接口,用extends关键字
- 更高级的抽象:定义接口变量,承接类对象:
interface A{} class B implements A{} A a = new B ();
- default是接口的特有方法,接口中用default修饰的方法需要在接口中实现。实现类可以不覆写default方法,其作用是免得在接口中添加方法而导致大量实现该接口类的失效。
- 接口中不能有实例属性,但是可以有静态属性;
分类:
Java
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性