zoukankan      html  css  js  c++  java
  • 2020年8月31日 Java8之后,接口又增加了两种新成员:静态方法、默认方法;继承实现冲突问题

    package com.atguigu.test08;
    
    /*
     * 1、Java8对接口进行了修改:
     * Java8之前,接口中的成员只有两种:
     * (1)全局的静态的常量:public static final,可以省略
     * (2)公共的抽象的方法:public abstract,可以省略
     * 
     * Java8之后,接口又增加了两种新成员:
     * (3)静态方法:public static,不可以省略
     *         调用方式:接口名.静态方法(实参列表)
     * (4)默认方法:public default,不可以省略
     * 
     * 2、为什么Java8要允许接口中定义静态方法?
     * 是因为JDK发展了一段时间后,发现类库中,多了很多这样的成组的API:
     * (1)Path接口和Paths工具类
     * (2)Collection接口和Collections工具类
     * .....
     * 一般工具类中都是静态方法,这些静态方法,基本上都是为前面这个对应接口服务的。
     * 这样的话,就会出现很多API,使得程序员的学习成本增加了,使用成本也增加了。
     * 
     * 开始把这样的静态方法,直接挪到接口中定义就好了。减少了这样的工具类的出现。
     * 
     * 3、为什么么Java8要允许接口中定义默认方法?
     * 是因为有的时候,一个接口它的大多数实现类对接口的抽象方法的实现代码是一样,那么我们写好几次就太麻烦了。
     * 即相当于,默认方法是原来的抽象方法有了一个默认实现。如果实现类的实现和接口一样,就不需要重写,如果不一样就重写即可。
     * 
     * 4、冲突问题
     * (1)当一个类同时实现了两个甚至更多个接口时,这些个接口中出现了方法签名相同的默认方法时,
     * 那么我们必须在这个实现类中,做出选择。
     * 选择一:保留其中一个,放弃另一个
     * 选择二:两者都不用,完全重写一个
     * 
     * (2)当一个类同时继承了父类,又实现了接口,那么当父类中出现了和接口中方法签名一样的方法时,怎么办?
     * 那么我们怎么选择?
     * 选择一:默认选择,编译器默认选择父类
     * 选择二:改选保留接口的
     * 选择三:完全自己重写
     *  */
    public class TestInterface18 {
        public static void main(String[] args) {
            MyInter.test();
            
    //        MyInter my = new MyInter();//接口不能创建对象
            
    //        MyInter my = new InterImpl1();
    //        my.method();
            
            Son s = new Son();
            s.test();
        }
    }
    interface MyInter{
        public static void test(){
            System.out.println("接口中的静态方法");
        }
        
        void fun();
        
        public default void method(){
            System.out.println("接口中的默认方法");
        }
    }
    class InterImpl1 implements MyInter{
    
        @Override
        public void fun() {
            System.out.println("aaaa");
        }
        
    }
    class InterImpl2 implements MyInter{
    
        @Override
        public void fun() {
            System.out.println("aaaa");
        }
        
    }
    class InterImpl3 implements MyInter{
    
        @Override
        public void fun() {
            System.out.println("bbbb");
        }
    
        //在类中,重写接口的默认方法是,default要去掉
        @Override
        public void method() {
            System.out.println("重写接口的默认方法");
        }
        
    }
    interface A{
        public default  void test(){
            System.out.println("aaa");
        }
    }
    interface B{
        public default  void test(){
            System.out.println("bbb");
        }
    }
    class C implements A,B{
        //选择一:保留其中一个,放弃另一个
        //在类中,重写接口的默认方法是,default要去掉
    /*    public void test(){
    //        A.super.test();//保留A接口的实现
            B.super.test();//保留B接口的实现
        }*/
        
        public void test(){
            System.out.println("ccc");
        }
    }
    
    class Father{
        public void test(){
            System.out.println("ffff");
        }
    }
    interface D{
        public default void test(){
            System.out.println("dddd");
        }
    }
    class Son extends Father implements D{
        //选择一:默认选择,保留父类的
        //选择二:该选,保留干爹的
    //    public void test(){
    //        D.super.test();
    //    }
        
        //选择三:完全自己重写
        public void test(){
            System.out.println("ssss");
        }
    }
  • 相关阅读:
    浅谈JS的数组遍历方法
    浅谈JavaScript函数重载
    随机数的组合问题(JavaScript描述)
    如何使用百度bae部署web项目
    阿里前端笔试总结
    有趣的JavaScript隐式类型转换
    CSS如何实现”右部宽度固定,左部自适应“的布局
    Nor Flash的理论性能
    python argparse:命令行参数解析详解
    rwcheck:为嵌入式设备设计的读写压测工具
  • 原文地址:https://www.cnblogs.com/douyunpeng/p/13592358.html
Copyright © 2011-2022 走看看