zoukankan      html  css  js  c++  java
  • java 8 接口默认方法

    解决问题:在java8 之前的版本,在修改已有的接口的时候,需要修改实现该接口的实现类。

    作用:解决接口的修改与现有的实现不兼容的问题。在不影响原有实现类的结构下修改新的功能方法

    案例:

    首先定义一个接口DefaultMethodInterface,该接口中定义了静态变量/接口方法/无返回值的默认方法/静态的默认方法/,在java8之前的版本是无法定义默认的方法。

    package com.ven.java8.defaultmethod.Inteface;
    
    /**
     * jva8接口默认方法
     * @author xiaowen0623
     *
     */
    public interface DefaultMethodInterface {
        /**
         * 接口静态变量
         */
        public static final String TYPE="JAVA8";
    
        /**
         * 接口静态变量
         */
        public static final String ZW="JAVA WEB开发工程师";
        /**
         * 接口方法
         * 
         * @param userName
         */
        public void execute(String userName);
    
        /**
         * 默认方法
         * 
         * @param userName
         */
        default void learn(String userName) {
            System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
        }
    
        /**
         * 默认的静态方法
         * 
         * @param userName
         * @return
         */
        public static String learnStr(String userName) { 
            String result = userName + " " + "是一名"+ZW;
            return result;
    
        };
    
    }

    编写一个测试类:

    package com.ven.java8.defaultmethod.Inteface;
    
    /**
     * 测试接口默认方法
     * 
     * @author xiaowen
     *
     */
    public class TestDefaultMethodInterface {
        public static void main(String[] args) {
            // 新创建一个接口实例
            DefaultMethodInterface defaul = new DefaultMethodInterface() {
                @Override
                public void execute(String userName) {
                    System.out.println(userName + "正在漫漫搬运代码......");
                }
    
            };
            // 调用接口的默认方法
            defaul.learn("xiaowen");
            // 调用接口方法
            defaul.execute("xiaowen");
            // 调用接口的静态方法
            String result = DefaultMethodInterface.learnStr("xiaowen");
            System.out.println(result);
        }
    }

    控制台打印信息:

    xiaowen正在学习JAVA8。。。。。。
    xiaowen正在漫漫搬运代码......
    xiaowen 是一名JAVA WEB开发工程师

    总结:

    java8的默认接口方法在不破坏java现有实现架构的情况下能往接口里增加新方法。

    java 8抽象类和接口的区别:

    相同点:

    Ø  都是抽象类型

    Ø  都可以有实现方法(在java8之前是不可以的)

    Ø  都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

    不同点:

    Ø  抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

    Ø  抽象类和接口所反映出的设计理念不同。其实抽象类表示的是”is-a”关系,接口表示的是”like-a”关系;

    Ø  接口中定义的变量默认是publicstatic final 型,且必须给其初值,所以实现类中不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

    想一个问题,如果在A接口和B接口中都定义了相同名称的默认方法,实现类C同时实现这两个接口,会出现怎样的情况呢?

    定义接口DefaultMethodInterface

    package com.ven.java8.defaultmethod.Inteface;
    
    /**
     * jva8接口默认方法
     * @author xiaowen0623
     *
     */
    public interface DefaultMethodInterface {
        /**
         * 接口静态变量
         */
        public static final String TYPE="JAVA8";
    
        /**
         * 接口静态变量
         */
        public static final String ZW="JAVA WEB开发工程师";
        /**
         * 接口方法
         * 
         * @param userName
         */
        public void execute(String userName);
    
        /**
         * 默认方法
         * 
         * @param userName
         */
        default void learn(String userName) {
            System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
        }
    
        /**
         * 默认的静态方法
         * 
         * @param userName
         * @return
         */
        public static String learnStr(String userName) { 
            String result = userName + " " + "是一名"+ZW;
            return result;
    
        };
    
    }

    定义接口DefaultMethodInterfaceB

    package com.ven.java8.defaultmethod.Inteface;
    
    /**
     * jva8接口默认方法
     * @author xiaowen0623
     *
     */
    public interface DefaultMethodInterfaceB {
        /**
         * 接口静态变量
         */
        public static final String TYPE="SPRING";
    
        /**
         * 接口静态变量
         */
        public static final String ZW="JAVA 服务器端开发工程师";
        /**
         * 接口方法
         * 
         * @param userName
         */
        public void execute(String userName);
    
        /**
         * 默认方法
         * 
         * @param userName
         */
        default void learn(String userName) {
            System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
        }
    
        /**
         * 默认的静态方法
         * 
         * @param userName
         * @return
         */
        public static String learnStr(String userName) { 
            String result = userName + " " + "是一名"+ZW;
            return result;
    
        };
    
    }

    实现类DefaultMethodImpl

    package com.ven.java8.defaultmethod.Inteface;
    /**
     * 默认方法接口实现类
     * @author xiaowen
     *
     */
    public class DefaultMethodImpl implements DefaultMethodInterface,DefaultMethodInterfaceB{
    
        @Override
        public void learn(String userName) {
            DefaultMethodInterfaceB.super.learn(userName);
        }
    
        @Override
        public void execute(String userName) {
    
        }
    
    }

    可见该实现类重写了默认方法learn(String userName),调用指定的接口默认方法,可以由实际改变。 

    如果是实现DefaultMethodImpl实现其中的一个接口,比如:DefaultMethodInterface,默认可以不需要重写默认方法,

    package com.ven.java8.defaultmethod.Inteface;
    /**
     * 默认方法接口实现类
     * @author xiaowen
     *
     */
    public class DefaultMethodImpl implements DefaultMethodInterface{
    
        @Override
        public void execute(String userName) {
    
        }
    
    }

    重写默认方法

     package com.ven.java8.defaultmethod.Inteface;

    /**
     * 默认方法接口实现类
     * @author xiaowen
     *
     */
    public class DefaultMethodImpl implements DefaultMethodInterface{
    
    
        @Override
        public void learn(String userName) {
            System.out.println("呵呵");
        }
    
        @Override
        public void execute(String userName) {
    
        }
    
    }

    测试:

    package com.ven.java8.defaultmethod.Inteface;
    /**
     * 测试
     * @author xiaowen
     *
     */
    public class TestImpl {
    public static void main(String[] args) {
        DefaultMethodInterface d = new DefaultMethodImpl();
        d.learn("xiaowen");
    }
    }
  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9338285.html
Copyright © 2011-2022 走看看