Java8对接口的新特性
接口
在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。JDK8及以后,允许在接口中定义static方法和default方法,JDK1.9时,接口又增加了私有方法,用于服务于本接口其他方法。default方法:必须用default关键字修饰,而且可以被实现类重写,它只能通过接口实现类的对象来调用。
static方法:只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。
抽象类和接口的区别
抽象类:
- 抽象类不能实例化,必须要由继承它的子类来创建实例。
- 抽象方法只有方法的声明,没有方法体。抽象类中的抽象方法必须要在子类中重写。
- 抽象类中既可以有抽象方法,也可以有普通方法,普通方法可不用重写。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中可以有构造方法,是供子类创建对象时,初始化父类成员变量使用的。
- 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
- 只要包含一个抽象方法的类,该类必须要定义成抽象类。
- abstract不能用来修饰属性、构造器等结构。
- abstract不能与final并列修饰同一个类。
- abstract不能与private、static、final或native并列修饰同一个方法。
接口:
- 接口没有构造方法,不能创建对象。
- 成员变量默认自带修饰符public static final,即为静态常量。
- 抽象方法默认自带修饰符public abstract(jdk8之前版本接口中方法只能是抽象方法)
- 接口是用来被实现的,其实现类必须重写它的所有抽象方法,除非实现类是个抽象类
- 接口可以多实现,一个类可以同时实现多个接口
- 接口可以继承接口,接口之间支持多继承
- 在JDK1.8时,接口中允许声明默认方法和静态方法:
- 公共的默认的方法:其中public 可以省略,建议保留,但是default不能省略
- 公共的静态的方法:其中public 可以省略,建议保留,但是static不能省略
- 如果子类(或实现类)继承的父类和实现的接口中声明了同名的成员变量,那么在调用的时候会报错,模糊不清。
- 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写该方法的情况下,默认调用父类中的同名同参数的方法。-->类优先原则。
- 如果实现类实现了多个接口(没有继承),而多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,会报错。-->接口冲突,这就需要我们在实现类中重写此方法;如果两个接口中的静态方法一模一样,并且实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。
- 如果需要调用父类中方法或接口中默认方法,父类使用 super.方法名,接口使用 接口名.super.方法名。
参考:
https://www.cnblogs.com/tanghaorong/p/11246043.html
https://blog.csdn.net/sunyufeng22/article/details/120463364
分类:
Java基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!