• 接口


    接口

    接口的定义

    • 接口是多个类的公共规范,就像是一种约定

    • 接口是一种引用数据类型,最重要的内容就是其中的抽象方法

    • 接口格式:public interface 接口名称 { 接口内容 }

    • 接口可包含的内容有:常量、抽象方法、默认方法、静态方法、私有方法

    接口使用方法

    抽象方法

    • 接口不能直接使用,必须有一个实现类来实现该接口

      格式:public class 实现类名称 implements 接口名称

    • 接口的实现类必须覆盖重写接口所有的抽象方法

    • 创建实现类的对象才可以使用

    • 注意:如果实现类没有覆盖重写接口中所有的抽象方法,那么这个实现类就是抽象类(用abstract修饰)

      格式:public abstract 返回值类型 方法名称 (参数列表);

      package character;
      //接口
      public interface AD {
          //定义抽象方法,能够进行物理攻击
          public abstract void physicalAttrack();
      }
      
      ////////////////////////////
      
      package character;
      //实现类
      public class ADHero implements AD {
      
          String name; //姓名
          private float hp;//血量
          private float armor; //护甲
          int moveSpeed; //移动速度
      
          //覆盖重写接口的抽象方法
          @Override
          public void physicalAttrack(){
              System.out.println("进行物理攻击");
          }
      }
      
      //////////////////////////////
      
      package character;
      
      public class ADHeroInterface {
          public static void main(String[] args) {
              //创建实现类的对象
              ADHero hero = new ADHero();
              hero.physicalAttrack();
          }
      }
      

    默认方法和静态方法(Java 8)

    • 接口中允许使用默认方法,主要用于解决接口升级问题

    • 接口的默认方法可以通过实现类直接调用,也可以被实现类覆盖重写

      格式:public default 返回值类型 方法名称 (参数列表) { 方法体 }

    • 接口中也可使用静态方法,且不能通过实现类的对象来调用接口中的静态方法,应直接通过接口名称调用静态方法

      格式:public static 返回值类型 方法名称 (参数列表) { 方法体 }

      package character;
      //接口
      public interface AD {
          //定义抽象方法,能够进行物理攻击
          public abstract void physicalAttrack();
      
          //新添加一个方法,应为默认方法,
          //当为抽象方法时,实现类应该重新覆盖重写,否则会报错
          public default void recieve(){
              System.out.println("复活");
          }
          
          //定义静态方法
          public static void methodStatic(){
              System.out.println("这是静态方法");
          }
      }
      
      ///////////////////////////////
      
      package character;
      //实现类
      public class ADHero implements AD {
          String name; //姓名
          private float hp;//血量
          private float armor; //护甲
          int moveSpeed; //移动速度
      
          //覆盖重写接口的抽象方法
          @Override
          public void physicalAttrack(){
              System.out.println("进行物理攻击");
          }
      
      //    //可以覆盖重写默认方法
      //    @Override
      //    public void recieve() {
      //        System.out.println("覆盖重写默认方法");
      //    }
      }
      
      ////////////////////////////////
      
      package character;
      
      public class ADHeroInterface {
          public static void main(String[] args) {
              //创建实现类的对象
              ADHero hero = new ADHero();
              hero.physicalAttrack();
              hero.recieve();//可直接调用默认方法
      		AD.methodStatic();//直接通过接口调用静态方法
          }
      }
      

    私有方法(Java 9)

    • 可用私有方法解决接口中方法的重复代码问题

    • 普通私有方法解决多个默认方法之间重复代码的问题

      格式:private 返回值类型 方法名称 (参数列表) { 方法体 }

    • 静态私有方法解决多个静态方法之间重复代码的问题

      格式:private static 返回值类型 方法名称 (参数列表) { 方法体 }

      //接口
      public interface AD {
      
          //定义抽象方法,能够进行物理攻击
          public abstract void physicalAttrack();
      
          //新添加一个方法,应为默认方法,
          // 当为抽象方法时,实现类应该重新覆盖重写,否则会报错
          public default void recieve(int hp){
              System.out.println("复活");
              methodCommonRecieve(hp);
          }
      
          //定义静态方法
          public static void methodStatic(){
              System.out.println("这是静态方法");
              methodCommonStatic();
          }
      
          //普通私有方法
          private void methodCommonRecieve(int hp){
              System.out.println("加血:" + hp);
          }
      
          //静态私有方法
          private static void methodCommonStatic(){
              System.out.println("AAAAA");
          }
      }
      

    接口常量

    • 接口中的常量需用 public static final三个关键字修饰

      例如:public static final int NUM_OF_HP = 10;

    • 接口中的常量必须进行赋值

    • 接口常量的名称使用完全大写的字母,用下划线分隔

    继承多个接口

    • 接口无静态代码块或者构造方法

    • 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口

      格式:public class 实现类名称 implements 接口1, 接口2

      • 如果实现类所实现的多个接口中存在重复的抽象方法,只需要覆盖重写一次

      • 如果实现类所实现的多个接口中存在重复的默认方法,那么实现类一定要对冲突的默认方法覆盖重写

    • 注意:如果一个类的直接父类的方法和接口中的默认方法产生冲突,优先调用父类中的方法,即继承优先于接口

    • 一个接口可以继承多个接口

      格式:public interface 接口3 extends 接口1, 接口2

      • 如果多个父接口中存在重复的抽象方法,没关系
      • 如果多个父接口中存在重复的默认方法,那么子接口必须对默认方法覆盖重写
      package character2;
      
      public interface AD {
      
          public abstract void attrack();
          public default void method(){
              System.out.println("这是物理攻击英雄");
          }
      }
      
      ////////////////////////////////
      
      package character2;
      
      public interface AP {
          
          public abstract void attrack();
          public default void method(){
              System.out.println("这是魔法攻击英雄");
          }
      }
      
      /////////////////////////////////
      
      package character2;
      
      public interface ADAPHero extends AD, AP {
      
          //重复的抽象方法不需要覆盖重写
          //重复的默认方法需要在子接口覆盖重写
          @Override
          default void method() {
              System.out.println("这是进行物理攻击和魔法攻击的英雄");
          }
      }
      
      /////////////////////////////////
      
      package character2;
      
      public class Hero implements ADAPHero {
      
          //重复的抽象方法在实现类需要覆盖重写
          @Override
          public void attrack() {
              System.out.println("抽象方法,物理魔法攻击");
          }
      
          public static void main(String[] args) {
              Hero hero = new Hero();
              hero.attrack();
              hero.method();
          }
      }
      
  • 相关阅读:
    acwing272. 最长公共上升子序列
    哈夫曼编码简单实现
    Linked List Sorting
    jmeter-线程组
    css-书写规范
    mysql-踩坑记录
    vue-npm install
    css-选择器
    js-process对象
    linux-常用命令
  • 原文地址:https://www.cnblogs.com/geqianLee/p/13025573.html
Copyright © 2020-2023  润新知