前言

  • Jdk1.8之前的接口中只声明方法,方法具体实现应在子类中进行。
  • Jdk1.8打破了这样的用法:接口中可以实现具体的方法体,只需要加上关键字static或者default修饰即可。
  1. default关键字

    public interface UserService {
        //自定义方法
        void getUsername();
        //默认方法
        default void defaultUsername(){
            System.out.println("UserService>>>>>>>defaultUsername");
        }
        //默认方法,子类重写
        default void overrideDefaultUsername(){
            System.out.println("UserService>>>>>>>overrideDefaultUsername");
        }
    
    }
    public class UserServiceImpl implements UserService {
    
        @Override
        public void getUsername() {
            System.out.println("UserServiceImpl>>>>>>>>>getUsername");
        }
    
        @Override
        public void overrideDefaultUsername() {
            System.out.println("UserServiceImpl>>>>>>>>>overrideDefaultUsername");
        }
    
    }
    public class Test {
    
        public static void main(String[] args) {
            UserService userService = new UserServiceImpl();
            userService.getUsername();
            userService.defaultUsername();
            userService.overrideDefaultUsername();
        }
    
    }
    "结果打印数据:"
    UserServiceImpl>>>>>>>>>getUsername
    UserService>>>>>>>defaultUsername
    UserServiceImpl>>>>>>>>>overrideDefaultUsername
  2. static关键字

    public interface UserService {
    
    void getUsername();
    
    default void defaultUsername(){
        System.out.println("UserService>>>>>>>defaultUsername");
    }
    
    default void overrideDefaultUsername(){
        System.out.println("UserService>>>>>>>overrideDefaultUsername");
    }
    
    static void staticUsername(){
        System.out.println("UserService>>>>>>>staticUsername");
    }
    
    }
    public class UserServiceImpl implements UserService {
    
        @Override
        public void getUsername() {
            System.out.println("UserServiceImpl>>>>>>>>>getUsername");
        }
    
        @Override
        public void overrideDefaultUsername() {
            System.out.println("UserServiceImpl>>>>>>>>>overrideDefaultUsername");
        }
    
    }
    在子类中发现不能重写被static关键字修饰的方法。
    public class Test {
    
        public static void main(String[] args) {
            UserService userService = new UserServiceImpl();
            userService.getUsername();
            userService.defaultUsername();
            userService.overrideDefaultUsername();
            UserService.staticUsername();
        }
    
    }
    "结果打印数据"
    UserServiceImpl>>>>>>>>>getUsername
    UserService>>>>>>>defaultUsername
    UserServiceImpl>>>>>>>>>overrideDefaultUsername
    UserService>>>>>>>staticUsername

总结
  default:
      1. detault关键字修饰的方法称为默认方法
      2. 子类可以选择性的是否重写该方法
      3. 接口中的default方法通过实例对象来调用
  static:
      1. static关键字修饰的方法称为静态方法
      2. 子类不能重写该方法
      3. 接口中的静态方法通过接口名.方法名()的方式来