• 接口interface


    接口interface

    一个完整的项目:classinterfaceenum, annation+资源文件(配置文件)+jar
    接口语法:
    public interface 接口名称{
      
    }
    类与类单继承关系,利用接口进行弥补单根继承的关系。
    在工作中,接口名称只有2种:
            ***Dao/DAO.java
            ***Service.java
    用户接口:UserInfoDao.java
    

    作用:制定规则,制定规范

    组成部分

    接口里面的组成部分全部都是public,接口中的属性默认是常量,一旦创建不可更改

    public interface MyInterface {
        //常量[public static final]一般省略不写
        // 必须初始化,且不允许更改常量的名称全部都是大写
         int id=100;
         String name="admin";
        //jdk1.8之前的方法全是抽象方法,且都是public abstract
        void a();
        int max(int num1,int num2);
    }
    
    使用接口

    接口和类的关系:多实现的关系,类可以实现多个接口,如果一个类实现了这个接口,说明该类为接口的实现类

    创建的类需要实现接口,加上implement关键字

    public class MyInterfaceImpl implements MyInterface {
        
        @Override
        public void a() {
           //方法重写 
        }
        @Override
        public int max(int num1, int num2) {
            return 0;
        }
    }
    

    然后通过创造接口实现类的对象来调用接口的方法

    public class Test1 {
        public static void main(String[] args) {
            MyInterfaceImpl myInterface=new MyInterfaceImpl();
            myInterface.a();
            System.out.println(myInterface.max(10,100));
        }
    }
    

    通过接口便于集成,而且一个类可以实现多个接口,

    public class MyInterfaceImpl implements MyInterface,MyIterface2 {
        @Override
        public void a() {
    
        }
        @Override
        public int max(int num1, int num2) {
            return 0;
        }
        @Override
        public void fun() {
            
        }
        @Override
        public String show() {
            return null;
        }
    }
    
    接口和接口

    属于多继承关系,extends

    子类接口代码:

    public interface MyInterface extends MyIterface2 {
         int id=100;
         String name="admin";
        void a();
        int max(int num1,int num2);
    }
    

    对于实现类而言需要实现MyInterface接口,也需要重写它父类接口的方法

    public class MyInterfaceImpl implements MyInterface {
    
        @Override
        public void a() {
    
        }
        @Override
        public int max(int num1, int num2) {
            return 0;
        }
        @Override
        public void fun() {
    
        }
        @Override
        public String show() {
            return null;
        }
    }
    
    jdk1.8之后的接口组成部分:

    如果接口中的属性和方法加上一些关键字:

    接口代码

    public interface MyIterface2 {
        int num=36;//常量
        String fun();//默认是抽象方法
        //接口的新特性:与抽象类是相似的
    

    default来修饰接口的普通方法

    default void a(){
            System.out.println("接口里面的a方法");
        }
    

    static来修饰方法

    static int b(){
            System.out.println("接口里面的static的b方法");
            return 100;
        }}
    

    那么在接口实现类中需要重写接口中的方法:

    接口实现类代码:

    public class MyInterfaceImpl extends Object implements MyIterface2 {
        @Override
        public String fun() {//抽象方法
            MyIterface2.b();
            System.out.println("重写的string的fun方法");
            return null;
        }
    

    对于default修饰的普通接口方法,是默认存在的,可以直接用对象调用,也可以重写该方法

    @Override
    public void a() {
        //调用父接口的原功能,可以让该类继承object类,看接口实现类第一行代码,如果继承的接口类们共有该方法,那么该方法必须被重写
        //object来做接口实现类
        MyIterface2.super.a();
        System.out.println("重写的default的a方法");
    }
    

    对于static修饰的接口方法,可以通过接口直接调用该方法

    public static void main(String[] args) {
        MyInterfaceImpl myInterface=new MyInterfaceImpl();
        myInterface.a();
        myInterface.fun();
    }
    

    这里输出结果是:

    接口里面的a方法
    重写的default的a方法
    接口里面的static的b方法
    重写的string的fun方法
    

    说明这里的static没有最先执行,因为接口不是类,所以会按照顺序来执行

    接口多态

    多态的方式创建对象,父接口的引用指向任意一个接口实现类的对象,

    语法:[接口名 对象 =new 接口实现类();]

    MyIterface2 myIterface2=new MyInterfaceImpl();
    //MyInterfaceImpl myInterface=new MyInterfaceImpl();
    这两行效果是一样的
    

    tips:当接口实现类中有很多其他接口的方法,此时创建出来的对象不能调用到其他接口的方法,但可以先判断该对象是否是实现类的对象,用instanceof判断,如果相同类型的话通过将对象强制转换成接口实现类的类型,所以当实现类中有其他接口的情况下,一般不使用接口多态,会直接创建实现类的对象。

    函数式接口:有且只有一个抽象方法

    要在接口加上注解@FunctionalInterface,加上之后代表接口里面有且只有一个抽象方法,jdk1.8之后如果接口有且只有一个抽象方法,推荐使用lamda替换接口匿名内部类,lamda语法:(形参类型 变量名称)->{方法体}

    @FunctionalInterface
    public interface MyIterface2 {
        int num=36;//常量
        void fun();
        }
    
    public class Test1 {
        public static void main(String[] args) {
            MyIterface2 myIterface2=()->{
                System.out.println("接口里面的fun方法");
            };//替换接口里面抽象方法的重写,lamda只重写抽象方法,而且相当于创建了一个匿名内部类
            myIterface2.fun();
        }
    }
    
    有参无返回值:
    void fun(String st);
    

    此时只有一个参数,接口里面的形参的变量类型可以省略不写,默认映射为string类型

    MyIterface2 myIterface2=(a)->{
        System.out.println("接口里面的fun方法"+a);
    };
    myIterface2.fun("p");
    
    无参有返回值:
    int fun();
    

    此时lamda的小括号不用加参数,如果直接返回,可以省略花括号,如果有方法体内容,不能省略花括号

    MyIterface2 myIterface2=()-> 3627;
    
      MyIterface2 myIterface2=()->{
              方法体
            return 3627;
        };
       
    
    有参有返回值:

    接口:

    public interface MyIterface2 {
        int userid=10086;
        String password="123pass";
        boolean login(int id,String password);
    }
    

    这时候实参和形参的传递可以用接口调用:接口名.属性

    public static void main(String[] args) {
        MyIterface2 myIterface2=( id, password)->{
            if(MyIterface2.userid!=id||MyIterface2.password.equals(password))
                return false;
            return true;
        };
        System.out.println(myIterface2.login(123,"pass"));
    }
    
    tips: lamda的简化:

    接口:

    public interface MyIterface2 {
        int userid=10086;
        String password="123pass";
        boolean login(String password);
    }
    

    对于lamda来创建匿名内部类来实现接口时,代码是这样写的:

    MyIterface2 myIterface2=(password)->{
       if(MyIterface2.password.equals(password))
           return true;
       return false;
    };
    

    但是lamda的可以进行简化:

    MyIterface2 myIterface2=(password)-> MyIterface2.password.equals(password);
    

    此时代码会报黄,说明还可以简化:

    MyIterface2 myIterface2= MyIterface2.password::equals;
    //MyIterface2.password被当做一个对象来调用equals方法
    

    所以简化语法:

    对象/类::调用方法

    举例巩固:

    接口中方法:

    int max(int num1,int num2);
    

    匿名内部实现类来调用方法:

    MyIterface2 myIterface2= Math::max;//Math是静态类,直接调用max方法
    
  • 相关阅读:
    Sudowrite:基于人工智能的AI写作文章生成工具
    计算机能转嵌入式吗?
    Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念,以及图像的基础操作 一
    Deep Dual-resolution Network 原理与代码解析
    为什么 hashMap 中长度必须是 2 的 n 次方幂?
    Jprofiler V14中文使用文档
    JavaWeb Jsp 综合案例(mybatis,servlet,maven,jsp)(增删改查)
    位置变量及实例
    每天坚持写java锻炼能力---第一天(6.4)
    Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
  • 原文地址:https://www.cnblogs.com/Liku-java/p/16809520.html