• 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");
    }
    }
  • 相关阅读:
    Redis系统管理
    Redis简介和安装
    在Azure中搭建Ghost博客并绑定自定义域名和HTTPS
    ML:单变量线性回归(Linear Regression With One Variable)
    PRML Chapter4
    Windows+Idea安装Hadoop开发环境
    包装类
    认识J2SE
    Spark基本原理
    SQL总结
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9338285.html
Copyright © 2020-2023  润新知