zoukankan      html  css  js  c++  java
  • 4、java基础:JDK8接口新特性以及接口和抽象类区别

    在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。由于这些修饰符都是默认的,所以在JDK8之前,下面的写法都是等价的。

    public interface JDK8BeforeInterface {  
        public static final int field1 = 0;  
      
        int field2 = 0;  
      
        public abstract void method1(int a) throws Exception;  
      
        void method2(int a) throws Exception;  
    }  

    JDK8及以后,允许我们在接口中定义static方法和default方法。

    public interface JDK8Interface {  
      
        // static修饰符定义静态方法  
        static void staticMethod() {  
            System.out.println("接口中的静态方法");  
        }  
      
        // default修饰符定义默认方法  
        default void defaultMethod() {  
            System.out.println("接口中的默认方法");  
        }  
    }  

    再定义一个接口的实现类:

    public class JDK8InterfaceImpl implements JDK8Interface {  
        //实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写  
    }  

    静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。

    public class Main {  
        public static void main(String[] args) {  
            // static方法必须通过接口类调用  
            JDK8Interface.staticMethod();  
      
            //default方法必须通过实现类的对象调用  
            new JDK8InterfaceImpl().defaultMethod();  
        }  
    }  

    当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。

    public class AnotherJDK8InterfaceImpl implements JDK8Interface {  
          
        // 签名跟接口default方法一致,但是不能再加default修饰符  
        @Override  
        public void defaultMethod() {  
            System.out.println("接口实现类覆盖了接口中的default");  
        }  
    }  

    由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。

    public interface JDK8Interface1 {  
      
        // static修饰符定义静态方法  
        static void staticMethod() {  
            System.out.println("JDK8Interface1接口中的静态方法");  
        }  
      
        // default修饰符定义默认方法  
        default void defaultMethod() {  
            System.out.println("JDK8Interface1接口中的默认方法");  
        }  
      
    }  
    public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {  
      
        // 由于JDK8Interface和JDK8Interface1中default方法一样,所以这里必须覆盖  
        @Override  
        public void defaultMethod() {  
            System.out.println("接口实现类覆盖了接口中的default");  
        }  
    }  
    public class Main {  
        public static void main(String[] args) {  
            JDK8Interface.staticMethod();  
            JDK8Interface1.staticMethod();  
            new JDK8InterfaceImpl().defaultMethod();  
        }  
    }  

    二者的区别

    抽象类:

      1、包含一个或多个抽象方法的类本身必须被声明成抽象的。

      2、除了抽象方法之外,抽象类还可以包含具体数据和具体方法

      3、扩展抽象类的两种选择(抽象方法的具体实现在子类中):

           A、 抽象类中定义部分抽象类或不定义抽象类方法,这样就必须将子类也标记为抽象类。

           B、定义全部的抽象方法,这样子类就不是抽象的了

       4、不能直接被实例化,可以间接使用

       5、一个类如果继承一个抽象类,必须实现该抽象类里声明的抽象方法

    接口:

    1、一个类可以实现(implement)一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象

    2、接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义

    3、接口中的所有方法自动地属于public,因此,声明方法时,不必提供关键字public,不过,实现接口时,必须把方法声明成public,否则,编译器将认为这个方法的访问属性是包可见性,即类的默认访问属性。

    4、接口中不能含有实例域或静态方法,但却可以包含常量

    5、接口不能被实例化

    6、接口中定义的方法都为抽象方法

    注:当多个接口中有同名、同参、返回值类型不同的方法时,会产生命名冲突(因为接口支持多继承,防止出现二义性)

    7、接口之间允许多继承(java只在接口允许多继承)

    8、Java 8用默认方法与静态方法这两个新概念来扩展接口的声明

  • 相关阅读:
    hdu 4027 Can you answer these queries? 线段树
    ZOJ1610 Count the Colors 线段树
    poj 2528 Mayor's posters 离散化 线段树
    hdu 1599 find the mincost route floyd求最小环
    POJ 2686 Traveling by Stagecoach 状压DP
    POJ 1990 MooFest 树状数组
    POJ 2955 Brackets 区间DP
    lightoj 1422 Halloween Costumes 区间DP
    模板 有源汇上下界最小流 loj117
    模板 有源汇上下界最大流 loj116
  • 原文地址:https://www.cnblogs.com/zupengliu/p/10802535.html
Copyright © 2011-2022 走看看