接口

接口

接口的定义

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

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

  • 接口格式: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();
        }
    }
    
posted @ 2020-06-01 15:43  搁浅Lee  阅读(168)  评论(0编辑  收藏  举报