66-Java接口:概述、多实现、多继承、JDK8后接口新增方法、接口注意事项(了解,极端面试可能会出现)

一、接口

1、接口是什么?
  • 接口也是一种规范:约束别人必须这样设计。

  • 规范一定是公开的:比如学校规定每天早上8点上课,是不是要公开出去?

  • 所以接口里面设计的常量和抽象方法必须都是公开化的,如果你不用public修饰,它也会默认为public,写不写都是公开的;

  • 举个例子:

    • 比如生活中的插座,规定是两孔就是两孔,你拿个三孔来插入两孔的,是不是就插不进?
      在这里插入图片描述

2、接口的定义与特点
  • 语法格式:

    • 接口用 interface 关键字来定义
    • 注意:由于接口体现规范思想,规范默认都是公开的,所以接口中代码层面沉淀的修饰符都可以省略不写
    public interface 接口名{
        // 常量
        // 抽象方法
    }
    
    package com.app.d9_interface;
    
    /**
        声明了一个接口:体现一种规范,规范一定是公开的。
        目标:理解接口中的成分特点:JDK 8 之前接口中只能有抽象方法和常量
     */
    public interface InterfaceDemo {
        // 注意:由于接口体现规范思想,规范默认都是公开的,所以代码层面沉淀的修饰符都可以省略不写
        // 1.常量
    //    public static final String SCHOOL_NAME = "B站大学";
        String SCHOOL_NAME = "B站大学";    // 不会报错,默认公开
    //    public static final String USER_NAME = "admin";
        String USER_NAME = "admin";     // 不会报错,默认公开
        String PASS_WORD = "123123";    // 不会报错,默认公开
    
        // 2.抽象方法
    //    public abstract void run();
        void run();     // 不会报错,默认公开
    //    public abstract void eat();
        void eat();     // 不会报错,默认公开
        void write();   // 不会报错,默认公开
    }
    



二、接口的使用

1、接口的实现
  • 接口是用来被类 实现(implements) 的,实现接口的类称为 实现类 ;实现类可以理解成所谓的子类。

    修饰符 class 实现类 implements 接口1,接口2,接口3, ...{
        
    }
    
  • 实现关键字:implements;

  • 从上面的代码中,接口可以被单类实现,也可以被类多实现

    package com.app.d10_interface_implements;
    
    /**
        运动员接口:体现运动员的规范
     */
    public interface SportMan {
        // 规范一:运动员一定要训练
        void run();
    
        // 规范二:运动员一定要参加比赛
        void competition();
    }
    
    package com.app.d10_interface_implements;
    
    /**
        法律接口:体现法律的规范
     */
    public interface Law {
        // 规范一:必须遵纪守法
        void rule();
    }
    
    package com.app.d10_interface_implements;
    
    /**
        乒乓球运动员类——>接口实现类:可以多实现,逗号隔开。
     */
    public class PingPongMan implements SportMan, Law{
        private String name;    // 乒乓球运动员姓名
    
        public PingPongMan(String name) { this.name = name; }
    
        @Override
        public void rule() {
            System.out.println(name + "必须遵纪守法!");
        }
    
        @Override
        public void run() {
            System.out.println(name + "必须每天训练~~");
        }
    
        @Override
        public void competition() {
            System.out.println(name + "要参加比赛,为国争光^_^");
        }
    }
    
    package com.app.d10_interface_implements;
    
    /**
        测试类:
        目标:理解接口的基本使用:被类实现
     */
    public class InterfaceImplementsTest {
        public static void main(String[] args) {
            PingPongMan pingPongMan = new PingPongMan("张继光");
            pingPongMan.rule();
            pingPongMan.run();
            pingPongMan.competition();
        }
    }
    
    张继光必须遵纪守法!
    张继光必须每天训练~~
    张继光要参加比赛,为国争光^_^
    
    Process finished with exit code 0
    
4、接口实现的注意事项
  • 一个类实现了接口,必须重写完:全部被实现接口的全部抽象方法,否则这个类需要定义成抽象类。


三、接口与接口的关系

1、基本小结
  • 类和类的关系:单继承;
  • 类和接口的关系:多实现;
  • 接口和接口的关系:多继承,一个接口可以同时继承多个接口
2、接口多继承的作用
  • 规范合并,整合多个接口为同一个接口,便于子类实现

  • 也就是:

    • 一个接口继承多个接口,得到多个接口的功能集结于自身,这样接口实现类就只需要实现一个接口,就能得到多个接口的功能。
    package com.app.d11_interface_extends;
    
    /**
        人接口
     */
    public interface People {
        /**
            规范:人必须吃东西、睡觉
         */
        void eat();
        void sleep();
    }
    
    package com.app.d11_interface_extends;
    
    /**
        法律接口
     */
    public interface Law {
        /**
            规范:必须守法——>不能杀人、吸毒等等
         */
        void rule();
    }
    
    package com.app.d11_interface_extends;
    
    /**
        运动员接口
        多继承:人接口、法律接口 集结于一身
     */
    public interface SportMan extends People, Law{
        /**
            规范:运动员必须运动、比赛
         */
        void run();
        void competition();
    }
    
    package com.app.d11_interface_extends;
    
    /**
        篮球运动员:接口实现类
        由于SportMan接口继承了多个接口,所以实现类只需要实现SportMan一个接口
     */
    public class BasketBallMan implements SportMan{
        @Override
        public void rule() {
            System.out.println("篮球运动员必须守法");
        }
    
        @Override
        public void eat() {
            System.out.println("篮球运动员必须吃东西");
        }
    
        @Override
        public void sleep() {
            System.out.println("篮球运动员必须睡觉");
        }
    
        @Override
        public void run() {
            System.out.println("篮球运动员必须训练");
        }
    
        @Override
        public void competition() {
            System.out.println("篮球运动员必须参加比赛");
        }
    }
    
    package com.app.d11_interface_extends;
    
    /**
        测试类
        目标:认识接口与接口之间的关系:多继承,并理解其作用
     */
    public class InterfaceExtendsTest {
        public static void main(String[] args) {
            BasketBallMan basketBallMan = new BasketBallMan();
            basketBallMan.rule();
            basketBallMan.run();
            basketBallMan.competition();
            basketBallMan.eat();
            basketBallMan.sleep();
        }
    }
    
    篮球运动员必须守法
    篮球运动员必须训练
    篮球运动员必须参加比赛
    篮球运动员必须吃东西
    篮球运动员必须睡觉
    
    Process finished with exit code 0
    



四、JDK8开始之后接口新增的方法

1、新增的方法
  • 之所以新增的原因呢!也很简单:
    • 比如一个程序员,日夜兼程的将一个软件开发出来了,但是呢,后面需要升级这个软件的版本,因此需要去丰富原来的接口,一堆堆的接口一个一个的丰富,丰富完了,还得去接口实现类,实现这些新增的功能,因此开发代码太大了;
    • 所以,java想到了一个办法:既能升级技术,又希望实现类的程序代码不用动
    • 这个办法就是:允许接口中直接定义带有方法体的方法
第一种:默认方法
  • 类似之前写的普通实例方法:必须用 defalut 修饰;

  • 默认会 public 修饰。需要用接口的实现类的对象来调用;

    defalut void run() {
        System.out.println("开始跑~~");
    }
    

在这里插入图片描述


第二种:静态方法
  • 默认会 public 修饰,必须 static 修饰;

  • 注意:接口的静态方法必须要用接口本身的接口名来调用

    static void inAddr() {
    	System.out.println("我们都在bilibili教育中心快乐的学习Java~~");
    }
    

在这里插入图片描述


第三种:私有方法
  • 就是私有的实例方法,必须使用 private 修饰,从 JDK9才开始有的

  • 只能在本接口中被其他的默认方法或者私有方法访问。

    private void go() {
    	System.out.println("准备~~")
    }
    

在这里插入图片描述



2、IDEA调整编译版本

在这里插入图片描述
在这里插入图片描述


  • 点完ok后,如下代码立马报错!!
    在这里插入图片描述

  • 只需要将jdk版本调整到jdk9之后,就没问题了
    在这里插入图片描述
    在这里插入图片描述



3、知识总结

1、JDK8开始新增了那些方法?

  • 默认方法:defalut修饰,实现类对象调用
  • 静态方法:static修饰,接口名称调用
  • 私有方法:private修饰,jdk9开始才有的,只能在接口内部其他的默认方法或者私有方法访问
  • 注意:它们都会默认被public修饰的

提醒:JDK8新增的3种方法我们自己在开发中很少使用的,通常是java源码涉及到。

现阶段需要理解、识别这些语法,明白调用关系即可




五、接口使用的注意事项

  • 1、接口不能创建对象;

    • 因为接口是很彻底的抽象,没有构造器,无法创建对象
  • 2、一个类实现多个接口,多个接口中有同样的静态方法不冲突;
    在这里插入图片描述


  • 3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名的方法,默认先使用父类的;
    在这里插入图片描述


  • 4、一个类实现了接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可;
    在这里插入图片描述


  • 5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。
    在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值