Java 接口

接口的定义:

接口就是多个类的公共规范
接口是一种引用数据类型,最重要的内容就是其中的:抽象方法

定义一个接口的格式:
public interface 接口名称 {
// 接口内容
}

备注:换成关键字interface之后,编译生成的字节码文件仍然是 .java -----> .class

如果是Java7,那么接口中可以包含的内容有:
1. 常量
2. 抽象方法
如果是Java8,还可以额外包含有:
3. 默认方法
4. 静态方法
如果是Java9,还可以额外包含有:
5. 私有方法

接口使用步骤:
1. 接口不能直接使用,必须有实现类来实现该接口
    public class 实现类名称 implements 接口名称 {
        //...
    }
2. 接口的实现类必须覆盖重写接口中所有的抽象方法 (去掉abstract关键字,加上方法体大括号),否则这个实现类必须是抽象类
3. 创建实现类对象,进行使用

接口抽象方法:

/*
在任何版本的Java中,接口都能定义抽象方法;
格式:
public abstract 返回值类型 方法名称(参数列表);

注意事项:
1. 接口的抽象方法中,修饰词必须是两个固定的关键字:public abstract
2. public abstract这两个关键字修饰符,可以选择性的省略
3. 方法三要素可以随意定义 (返回值类型,方法名,参数列表)
 */
public interface MyInterfaceAbs {

    //这是一个抽象方法
    public abstract void methodAbs1();

    //这也是一个抽象方法
    abstract void methodAbs2();

    //这也是一个抽象方法
    public void methodAbs3();

    //这也是一个抽象方法
    void methodAbs4();
}


// 接口实现类
public class MyInterfaceAbstractImpl implements MyInterfaceAbs {
    @Override
    public void methodAbs1() {
        System.out.println("这是第一个方法");
    }

    @Override
    public void methodAbs2() {
        System.out.println("这是第二个方法");
    }

    @Override
    public void methodAbs3() {
        System.out.println("这是第三个方法");
    }

    @Override
    public void methodAbs4() {
        System.out.println("这是第四个方法");
    }
}


//接口测试
public class Demo01Interface {
    public static void main(String[] args) {
        MyInterfaceAbstractImpl impl = new MyInterfaceAbstractImpl();
        impl.methodAbs1();
        impl.methodAbs3();
    }
}

 

接口默认方法:

从Java8开始,接口里允许定义默认方法

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

备注:接口中的默认方法,可以解决接口升级的问题。(已经有一些实现类投入使用,但是接口中需要新加一个方法,如果是加抽象方法,那之前所有的实现类都会报错。由此出现了默认方法)

public interface MyInterfaceDefault {

    //抽象方法
    public abstract void methodAbs();

    //默认方法
    public default void methodDefault() {
        System.out.println("这是新添加的默认方法");
    }
}

// 接口实现类
public class MyInterfaceDefaultA implements MyInterfaceDefault {
    @Override
    public void methodAbs() {
        System.out.println("实现了抽象方法,AAA");
    }
}

//测试
/*
1. 接口默认方法可以通过接口实现类直接调用
2. 接口默认方法也可以被接口实现类覆盖重写
 */
public class Demo02Interface {

    public static void main(String[] args) {
        // 创建了实现类对象
        MyInterfaceDefaultA a = new MyInterfaceDefaultA();
        a.methodAbs();

        a.methodDefault();

        MyInterfaceDefaultB b = new MyInterfaceDefaultB();
        b.methodAbs();

        b.methodDefault();
    }
}

 

接口静态方法:

从Java8开始,接口中允许定义静态方法

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

注意事项:不能通过接口实现类对象来调用接口中的静态方法,而是要通过接口名称,直接调用其中的静态方法
格式:接口名称.静态方法名(参数列表)

public interface MyInterfaceStatic {
    public static void methodStatic(){
        System.out.println("这是接口静态方法");
    }

}

//接口实现类
public class MyInterfaceStaticImpl implements MyInterfaceStatic {

}

//测试
public class Demo03Interface {
    public static void main(String[] args) {
        // 实现类对象
        //MyInterfaceStaticImpl impl = new MyInterfaceStaticImpl();

        // 错误写法,因为要调用接口静态方法直接使用接口名称即可
//        impl.methodStatic();

//        正确写法
        MyInterfaceStatic.methodStatic();
    }
}

 

接口私有方法:

问题描述:需要抽取一个共有方法,来解决两个默认方法之间重复代码的问题。但是这个共有方法不应该让实现类使用,应该是私有化的

解决办法:从Java9开始,接口当中允许定义私有方法

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

private 返回值类型 方法名称(参数列表){

方法体

}

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

private static 返回值类型 方法名称(参数列表){

方法体

}

public interface MyInterfacePrivateA {
    public default void methodDefault1() {
        System.out.println("默认方法1");
        methodCommon();
    }

    public default void methodDefault2() {
        System.out.println("默认方法2");
        methodCommon();
    }

    private void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }

}



public interface MyInterfacePrivateB {
    public static void methodStatic1() {
        System.out.println("静态方法1");
        methodCommon();
    }

    public static void methodStatic2() {
        System.out.println("静态方法2");
        methodCommon();
    }

    private static void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }

}

接口中的常量:

接口当中也可以定义"成员变量",但是必须使用 public static final 三个关键字来修饰,从效果上看,这就是接口的【常量】

格式:
public static final 数据类型 常量名称 = 数值;

注意:
1. 接口中的常量,可以省略 public static final 任何一个关键字,但是不写也照样默认是用这三个关键字修饰
2. 接口中的常量,必须进行赋值,不能不赋值
3. 接口中常量的名称使用完全的大写字母,使用下划线进行分隔

public interface MyInterfaceConst {

    public static final int NUM_OF_CLASS = 10;
}


public class Demo05Interface {
    public static void main(String[] args) {
        // 访问接口中的常量
        System.out.println(MyInterfaceConst.NUM_OF_CLASS);
    }
}

 

posted on 2021-06-23 17:46  mlllily  阅读(102)  评论(0编辑  收藏  举报