static方法

java8中为接口新增了一项功能:定义一个或者更多个静态方法。用法和普通的static方法一样。注意,实现接口的类或者子接口不会继承接口中的静态方法
_

示例代码

  1. public interface InterService {
  2. public static final String name = "玥玥玥";
  3. public abstract void test();
  4. static void showStatic(){
  5. System.out.println("showStatic");
  6. }
  7. }

运行测试

  1. public static void main(String[] args) {
  2. InterService.showStatic();
  3. System.out.println(InterService.name);
  4. }

结果

  1. showStatic
  2. 玥玥玥

default方法

也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods)。Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。 比如,只需在Collection接口中增加default Stream stream(), 相应的Set和List接口以及它们的子类都包含此的方法,不必为每个子类都重新copy这个方法

为什么需要这个方法

之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。

默认使用接口的default方法,示例代码如下:

接口InterService

  1. public static final String name = "玥玥玥";
  2. static void showStatic(){
  3. System.out.println("showStatic");
  4. }
  5. default void showDafault(){
  6. System.out.println("showDafault");
  7. }
  8. public abstract void test();

实现类InterServiceImpl

  1. @Override
  2. public void test() {
  3. System.out.println("testImpl");
  4. }
  5. public static void main(String[] args) {
  6. InterServiceImpl interService = new InterServiceImpl();
  7. interService.showDafault();
  8. interService.test();
  9. }

运行结果

  1. showStatic
  2. testImpl

可以重写接口中的default方法,示例代码如下:
实现类InterServiceImpl

  1. @Override
  2. public void showDafault() {
  3. System.out.println("showDafaultImpl");
  4. }
  5. @Override
  6. public void test() {
  7. System.out.println("testImpl");
  8. }
  9. public static void main(String[] args) {
  10. InterServiceImpl interService = new InterServiceImpl();
  11. interService.showDafault();
  12. interService.test();
  13. }

运行结果如下:

  1. showDafaultImpl
  2. testImpl

如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

新增接口InterServiceTemp,包含同样的**default**方法

  1. default void showDafault(){
  2. System.out.println("showDafault");
  3. }

同时实现具有两个相同default方法的接口

  1. public class InterServiceImpl implements InterService , InterServiceTemp {
  2. @Override
  3. public void showDafault() {
  4. System.out.println("showDafaultImpl");
  5. }
  6. @Override
  7. public void test() {
  8. System.out.println("testImpl");
  9. }
  10. }

必须要重写showDafault方法,不然会编译出错
1559805887(1).jpg

如果子类继承父类,父类中有showDefault方法,该子类同时实现的接口中也有showDefault方法(被default修饰),那么子类会继承父类的showDefault方法而不是继承接口中的showDefault方法

新增父类InterSuper

  1. public void showDafault() {
  2. System.out.println("showDafaultInterSuper");
  3. }

InterServiceImpl继承InterSuper并实现InterService接口

  1. public class InterServiceImpl extends InterSuper implements InterService{
  2. @Override
  3. public void test() {
  4. System.out.println("testSuper");
  5. }
  6. public static void main(String[] args) {
  7. InterServiceImpl interService = new InterServiceImpl();
  8. interService.showDafault();
  9. interService.test();
  10. }
  11. }

运行结果

  1. showDafaultInterSuper
  2. testSuper

可以在两个interface中实现重载的功能

示例代码
接口InterServiceA

  1. public static final String name = "玥玥玥";
  2. default void showDafault(Integer i){
  3. System.out.println("showDafault"+i);
  4. }

接口InterServiceB

  1. public static final String name = "三王月";
  2. default void showDafault(String mess){
  3. System.out.println("showDafault"+mess);
  4. }

实现类InterServiceTempAB

  1. public class InterServiceTempAB implements InterServiceA , InterServiceB {
  2. public static void main(String[] args){
  3. InterServiceTempAB interService = new InterServiceTempAB();
  4. interService.showDafault(new Integer(12));
  5. interService.showDafault("三王月");
  6. }
  7. }