接口interface

一个完整的项目:class,interface,enum, 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方法

原文地址:http://www.cnblogs.com/Liku-java/p/16809520.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性