之前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范围的)

最新文章

  1. 【leetcode】Simplify Path
  2. [译]git pull
  3. 怎么配置Java环境变量?
  4. Python Shell 解释器下使用Django Model
  5. 关于android4.3 Intel X86 Atom System Image的下载
  6. scala实现kmeans算法
  7. EF6数据迁移
  8. 程序启动原理和UIApplication
  9. [原]逆向iOS SDK -- +[UIImage imageNamed:] 的实现
  10. [leetcode-474-Ones and Zeroes]
  11. 在Python中数据类型转换的注意事项
  12. hdu 5305 friends
  13. nodejs http post 请求带参数
  14. FusionCharts封装-dataset和categories
  15. 了解Scala 宏
  16. ANG-----全方位保障您的数字资产安全
  17. SVN代码管理发布
  18. 腾讯在线文档发布:实现QQ、微信多平台多人协作编辑
  19. 索引原理 B tree
  20. android选择图片或拍照图片上传到服务器(包括上传参数)

热门文章

  1. 7.接入类流程-PRACH优化
  2. HTML简单介绍(个人角度)
  3. CentOS7设置集群环境SSH免密访问
  4. linux操作系统安装运行Redis
  5. memset函数及注意事项
  6. php多域名单站点路由
  7. selenium与页面交互之一:webdriver浏览器的属性
  8. mysql复制表结构,复制表数据
  9. SpringBoot项目中遇到的BUG
  10. Flask开发系列之Web表单