博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java8中接口default、static新特性,与抽象类区别
阅读量:5084 次
发布时间:2019-06-13

本文共 1905 字,大约阅读时间需要 6 分钟。

之前Java接口中的方法默认都是public abstract,成员变量默认都是public static final,偶然发现接口中可以有default类型的方法,才知道java8中接口可以有自己的实现了。那么jdk1.8究竟对接口做了哪些修改呢? 

(1) 增加default方法。default方法作用范围也是public,只是有了具体实现的方法体。对已有的接口,如果想对接口增加一个新方法,那么需要对所有实现该接口的类进行修改。而有了default方法,可以解决该问题。 
(2) 新增static方法。static修饰的方法也是非抽象方法,使用同类的静态方法一样,给方法的调用带来了方便。程序入口main方法也是static,现在接口也可以运行了。 
例如下面在InterfaceA中定义了一个default方法,一个static方法:

public interface InterfaceA {    default String f(){        return"this is InterfaceA"; } static String getName(){ return "InterfaceA"; } }

那么在实现类中可以直接调用接口的default方法,通过接口名.方法名调用static方法

public class ImplClass implements InterfaceA { public static void main(String[] args) { System.out.println(new ImplClass().f()); System.out.println(InterfaceA.getName()); } }

结果: 

这里写图片描述 
但是注意,如果一个类同时实现了两个拥有相同方法签名(相同的方法名、参数)、返回类型的default方法后,需要在类中重写default方法,否则编译器会因为不知道应该调用哪一个接口中的default方法而报错 
再定义一个InterfaceB接口,和InterfaceA接口拥有相同方法签名、返回类型的f()

public interface InterfaceB {    default String f(){       return "this is InterfaceB"; } }

ImplClass同时实现InterfaceA和InterfaceB,这时编译器会报错: 

这里写图片描述 
重写接口中default方法后,编译器会执行重写后的方法:

public class ImplClass implements InterfaceA,InterfaceB { @Override public String f(){ return "this is ImplClass"; } public static void main(String[] args) { System.out.println(new ImplClass().f()); } }

结果: 

这里写图片描述 
如果一个类同时继承的父类和实现的接口拥有相同签名、返回类型时,当该类未重写方法,直接调用时,将会调用父类中的方法: 
再定义一个父类FatherC,拥有和InterfaceA同签名、返回类型的方法f()

public class FatherC {    public String f(){        return "this is FatherC"; } }

ImplClass实现InterfaceA的同时继承FatherC,未重写方法f(),直接调用时,将会调用父类中的方法:

public class ImplClass extends FatherC implements InterfaceA { public static void main(String[] args) { System.out.println(new ImplClass().f()); } }

结果: 

这里写图片描述 
接口已经越来越向类靠近了,所以现在接口和抽象类的区别有: 
1. 虽然接口和抽象类都不能被实例化,但是抽象类可以有构造器,接口没有构造器 
2. 抽象类单继承(只能继承一个类),接口多继承(能继承多个接口) 
3. 抽象类中方法可以有public、protected、默认(包)甚至private范围的方法,接口只能有public范围的方法(即使是default也是public范围的) 

转载于:https://www.cnblogs.com/moxiaotao/p/10825390.html

你可能感兴趣的文章
XML解析技术研究(一)
查看>>
Qt 学习之路 :使用 QJson 处理 JSON
查看>>
NPOI操作Excel导入导出
查看>>
angularJS 移动端焦点图
查看>>
jvm 这我就能会了 擦
查看>>
实战技能:小小微信支付业务,何必虚惊一场
查看>>
17-1 djanjo进阶-路由,视图,模板
查看>>
Shell脚本8种字符串截取方法总结
查看>>
P3254 圆桌问题
查看>>
MapReduce的运行原理
查看>>
Leetcode: Partition List
查看>>
故障转移
查看>>
清空dataset中的某行某列的数据
查看>>
盒模型
查看>>
js中闭包和作用域
查看>>
CI框架整合UEditor编辑器上传功能
查看>>
树的层号表示
查看>>
最大整数
查看>>
[转] 数据模型建设的几点思考与总结
查看>>
[1].Common SSIS Applications
查看>>