• Java接口小知识


    1.

    接口就是多个类的公共规范。
    接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。

    如何定义一个接口的格式:
    public interface 接口名称 {
        // 接口内容
    }

    备注:换成了关键字interface之后,编译生成的字节码文件仍然是:.java --> .class。

    如果是Java 7,那么接口中可以包含的内容有:
    1. 常量
    2. 抽象方法

    如果是Java 8,还可以额外包含有:
    3. 默认方法
    4. 静态方法

    如果是Java 9,还可以额外包含有:
    5. 私有方法

    接口使用步骤:
    1. 接口不能直接使用,必须有一个“实现类”来“实现”该接口。
    格式:
    public class 实现类名称 implements 接口名称 {
        // ...
    }
    2. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
    实现:去掉abstract关键字,加上方法体大括号。
    3. 创建实现类的对象,进行使用。

    注意事项:
    如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。

    2.


    接口当中也可以定义“成员变量”,但是必须使用public static final三个关键字进行修饰。
    从效果上看,这其实就是接口的【常量】。
    格式:
    public static final 数据类型 常量名称 = 数据值;
    备注:
    一旦使用final关键字进行修饰,说明不可改变。

    注意事项:
    1. 接口当中的常量,可以省略public static final,注意:不写也照样是这样。
    2. 接口当中的常量,必须进行赋值;不能不赋值。
    3. 接口中常量的名称,使用完全大写的字母,用下划线进行分隔。(推荐命名规则)

    3.

    1. 接口的默认方法,可以通过接口实现类对象,直接调用。
    2. 接口的默认方法,也可以被接口实现类进行覆盖重写。

    4.

    注意事项:不能通过接口实现类的对象来调用接口当中的静态方法。
    正确用法:通过接口名称,直接调用其中的静态方法。
    格式:
    接口名称.静态方法名(参数);

    5.

    在任何版本的Java中,接口都能定义抽象方法。
    格式:
    public abstract 返回值类型 方法名称(参数列表);

    注意事项:
    1. 接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
    2. 这两个关键字修饰符,可以选择性地省略。(今天刚学,所以不推荐。)
    3. 方法的三要素,可以随意定义。

    6.

    从Java 8开始,接口里允许定义默认方法。
    格式:
    public default 返回值类型 方法名称(参数列表) {
        方法体
    }

    备注:接口当中的默认方法,可以解决接口升级的问题。

    7.

    问题描述:
    我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。
    但是这个共有方法不应该让实现类使用,应该是私有化的。

    解决方案:
    从Java 9开始,接口当中允许定义私有方法。
    1. 普通私有方法,解决多个默认方法之间重复代码问题
    格式:
    private 返回值类型 方法名称(参数列表) {
        方法体
    }

    2. 静态私有方法,解决多个静态方法之间重复代码问题
    格式:
    private static 返回值类型 方法名称(参数列表) {
        方法体
    }

    8.

    从Java 8开始,接口当中允许定义静态方法。
    格式:
    public static 返回值类型 方法名称(参数列表) {
        方法体
    }
    提示:就是将abstract或者default换成static即可,带上方法体。

    9.

    使用接口的时候,需要注意:

    1. 接口是没有静态代码块或者构造方法的。
    2. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
    格式:
    public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
        // 覆盖重写所有抽象方法
    }
    3. 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
    4. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
    5. 如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
    6. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。

    10.

    1. 类与类之间是单继承的。直接父类只有一个。
    2. 类与接口之间是多实现的。一个类可以实现多个接口。
    3. 接口与接口之间是多继承的。

    注意事项:
    1. 多个父接口当中的抽象方法如果重复,没关系。
    2. 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,【而且带着default关键字】。

    
    
    public interface Interface {
    
        String name="123";//默认为static变量
        
        //抽象方法(JDK7及以前)
        public void method1();
        public abstract void method2();
        abstract void method3();
        void method4();
    
        //默认方法(JDK8新增)
        public default void method5(){}
        //静态方法(JDK8新增)
        static void method6(){}
    
        //私有方法(JDK9新增)
        private void method7(){}
    }
    
    /*
    从Java 8开始,接口里允许定义默认方法。
    格式:
    public default 返回值类型 方法名称(参数列表) {
        方法体
    }
    
    备注:接口当中的默认方法,可以解决接口升级的问题。
     */
    public interface MyInterfaceDefault {
    
        // 抽象方法
        public abstract void methodAbs();
    
        // 新添加了一个抽象方法
    //    public abstract void methodAbs2();
    
        // 新添加的方法,改成默认方法
        public default void methodDefault() {
            System.out.println("这是新添加的默认方法");
        }
    
    }

    Java 接口

    接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

    接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

    除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

    接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

    接口与类相似点:

    • 一个接口可以有多个方法。
    • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
    • 接口的字节码文件保存在 .class 结尾的文件中。
    • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

    接口与类的区别:

    • 接口不能用于实例化对象。
    • 接口没有构造方法。
    • 接口中所有的方法必须是抽象方法。
    • 接口不能包含成员变量,除了 static 和 final 变量。
    • 接口不是被类继承了,而是要被类实现。
    • 接口支持多继承。

    接口特性

    • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
    • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
    • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

    抽象类和接口的区别

    • 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
    • 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
    • 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
    • 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    接口的声明

    接口的声明语法格式如下:

    [可见度] interface 接口名称 [extends 其他的接口名名] {
            // 声明变量
            // 抽象方法
    }

    Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。

    /* 文件名 : NameOfInterface.java */
    import java.lang.*;
    //引入包
     
    public interface NameOfInterface
    {
       //任何类型 final, static 字段
       //抽象方法
    }

     接口有以下特性:

    • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
    • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
    • 接口中的方法都是公有的。

    实例

    /* 文件名 : Animal.java */
    interface Animal {
       public void eat();
       public void travel();
    }

    接口的实现

    当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

    类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

    实现一个接口的语法,可以使用这个公式:

    Animal.java 文件代码:

    ...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

     实例

    /* 文件名 : MammalInt.java */
    public class MammalInt implements Animal{
     
       public void eat(){
          System.out.println("Mammal eats");
       }
     
       public void travel(){
          System.out.println("Mammal travels");
       } 
     
       public int noOfLegs(){
          return 0;
       }
     
       public static void main(String args[]){
          MammalInt m = new MammalInt();
          m.eat();
          m.travel();
       }
    }

    以上实例编译运行结果如下:

    Mammal eats
    Mammal travels

    重写接口中声明的方法时,需要注意以下规则:

    • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
    • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
    • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

    在实现接口的时候,也要注意一些规则:

    • 一个类可以同时实现多个接口。
    • 一个类只能继承一个类,但是能实现多个接口。
    • 一个接口能继承另一个接口,这和类之间的继承比较相似。

    接口的继承

    一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

    下面的Sports接口被Hockey和Football接口继承:

    // 文件名: Sports.java
    public interface Sports
    {
       public void setHomeTeam(String name);
       public void setVisitingTeam(String name);
    }
     
    // 文件名: Football.java
    public interface Football extends Sports
    {
       public void homeTeamScored(int points);
       public void visitingTeamScored(int points);
       public void endOfQuarter(int quarter);
    }
     
    // 文件名: Hockey.java
    public interface Hockey extends Sports
    {
       public void homeGoalScored();
       public void visitingGoalScored();
       public void endOfPeriod(int period);
       public void overtimePeriod(int ot);
    }

    Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。

    相似的,实现Football接口的类需要实现五个方法,其中两个来自于Sports接口。


    接口的多继承

    在Java中,类的多继承是不合法,但接口允许多继承。

    在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

    public interface Hockey extends Sports, Event

    以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports及 Event 可能定义或是继承相同的方法


    标记接口

    最常用的继承接口是没有包含任何方法的接口。

    标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

    标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

    例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

    package java.util;
    public interface EventListener
    {}

    没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:

    • 建立一个公共的父接口:

      正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

    • 向一个类添加数据类型:

      这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

  • 相关阅读:
    伯努利数学习笔记
    bzoj 3864: Hero meet devil(dp套dp)
    CF1137E. Train Car Selection(可删堆)
    洛谷P3779 [SDOI2017]龙与地下城(概率论+Simpson+FFT)
    洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)
    AtCoder Grand Contest 030题解
    Sort函数(C++)
    堆排序
    十进制--->二进制(利用C++栈功能)
    对局匹配
  • 原文地址:https://www.cnblogs.com/chenxiaoge/p/13335485.html
Copyright © 2020-2023  润新知