26、接口中的各类方法及其常量

接口

接口就是多个类的公共规范。

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

接口的格式:

public interface 接口名称{
	//接口内容
}

接口中包含的内容

如果是Java 7,那么接口中可以包含的内容有:

  1. 常量(不能改变的量)
  2. 抽象方法

如果是Java 8,还可以额外包含有:

  1. 默认方法
  2. 静态方法

如果是Java 9,还可以额外包含有:

  1. 私有方法

接口中的抽象方法

注意事项:

  1. 接口中的抽象方法,修饰符必须是两个固定的关键字:public abstract
  2. 这两个关键字修饰符,可以选择性的省略。
public interface MyInterfaceAbstract {
public abstract void methodAbs();
abstract void methodAbs1();
public void methodAbs2();
void methodAbs3();
}//这些都是抽象方法,因为可以省略的

接口的使用步骤(类比着抽象类)

  1. 接口不能直接使用,必须有一个“实现类”来“实现”该接口。//写法跟继承有些类似,把extends换成implements即可
public class 实现类名称 implements 接口名称{
	//...
}
  1. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
  2. 创建实现类的对象,进行使用。//接口对象无法创建,就像是抽象类对象无法直接创建一样(需要继承了抽象类的子类创建一个意思)

注意

如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。(和抽象类,抽象对象一个意思)

接口中的默认方法

从Java 8开始,接口里允许定义默认方法。

默认方法格式:

public default 返回值类型 方法名称(参数列表){
    方法体//抽象方法没有方法体和{},默认方法有
}//在这里public可省略

备注:接口当中的默认方法,可以解决接口升级的问题。(因为如果你想要向接口中添加别的功能的话,就只能添加抽象方法,但是如果添加抽象方法的话,就要保证每个抽象方法都必须被覆盖重写才行,那么就需要修改该接口对应的每个实现类,因为每个实现类中要保证所有抽象方法的覆盖重写(已测试,否则会报错)。就会很麻烦,添加默认方法应运而生)

使用方法:

在接口中加入默认方法即可,就可以通过该接口的实现类对象,调用该默认方法。

  1. 接口的默认对象,可以通过接口实现类对象,直接调用。
  2. 接口的默认方法,也可以被接口实现类进行覆盖重写。
接口:
    public interface MyInterfaceAbstract {
    public abstract void methodAbs();
    public default void methodDefault(){
        System.out.println("这是新添加的默认方法");
    }
}

实现类A:
    public class MyinterdfaceAbstractImplA implements MyInterfaceAbstract{

    @Override
    public void methodAbs() {
        System.out.println("这是覆盖重写的抽象方法");
    }
}

实现类B:
    public class MyinterdfaceAbstractImplB implements MyInterfaceAbstract{

    @Override
    public void methodAbs() {
        System.out.println("这是覆盖重写的抽象方法");
    }

    @Override
    public void methodDefault() {
        System.out.println("这是实现类B覆盖重写的默认方法");
    }
}

主函数调用:
    public class Demo02Interface {
    public static void main(String[] args) {
        MyinterdfaceAbstractImplA a = new MyinterdfaceAbstractImplA();
        a.methodAbs();//调用抽象方法
        a.methodDefault();//调用默认方法,没有进行覆盖重写

        MyinterdfaceAbstractImplB b = new MyinterdfaceAbstractImplB();
        b.methodAbs();
        b.methodDefault();//实现类B的默认方法覆盖重写
    }
}

输出结果:

这是覆盖重写的抽象方法
这是新添加的默认方法
这是覆盖重写的抽象方法
这是实现类B覆盖重写的默认方法

接口中的静态方法

从Java 8开始,接口中允许定义静态方法。

静态方法格式:

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

普通的静态方法,直接通过类名称就可以调用。同理 ,接口中静态方法的调用,直接 接口名.静态方法名 就可以调用了。

注意:不能通过接口实现类的对象来调用接口当中的静态方法。静态方法没有覆盖重写。

public class Demo03Interface implements MyInterfaceStatic{
    public static void main(String[] args) {
        MyInterfaceStatic.methodStatic();//直接通过接口名称调用静态方法
        //MyInterfaceStaticImpl x = new MyInterfaceStaticImpl();
        //x.methodStatic();//这是错的,不能通过接口实现类的对象来调用接口当中的静态方法。
    }
}

接口中的私有方法

问题描述

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

解决方案

从 Java 9开始,接口当中允许定义私有方法。

  1. 普通私有方法,解决多个默认方法之间重复代码问题
格式:
private 返回值类型 方法名称(参数列表){
	方法体
}

eg:
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");
}
  1. 静态私有方法,解决多个静态方法之间重复代码问
格式:
private static 返回值类型 方法名称(参数列表){
	方法体
}

eg:
public static void methodStatic1() {
    System.out.println("默认方法1");
    methodStaticCommon();
}

public static void methodStatic2() {
    System.out.println("默认方法2");
    methodStaticCommon();
    }

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

接口中的成员变量(常量)

接口中也可以定义“成员变量”,但是必须用public static final三个关键字进行修饰。其实就是接口的【常量】。

【常量】:一旦赋值,就不可以被修改。

注意:一旦使用final关键字进行修饰,说明不可改变。

  1. 接口当中的常量,可以省略public static final,但不写也照样是指常量。
  2. 接口当中的常量,必须进行赋值,不能不赋值。
  3. 接口中的常量名称,使用完全大写的字母,用下划线进行分隔。(推荐命名规则)
public static fianl 数据类型 常量名称 = 数据值;
eg:public static final int NUM_OF_CLASS = 10;

总结

在Java 9+版本中,接口的内容可以有:([]中括号表示可以省略)

1.成员变量其实是常量。
 [public]] [static] [fianl] 数据类型 常量名称 = 数据值;

注意

  • 常量必须进行赋值,而且一旦赋值不能进行改变。
  • 常量名称完全大写,用下划线进行分隔。
2.接口中最终的就是抽象方法。
 [public] [abstract] 返回值类型 方法名称(参数列表);

注意

  • 实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。
3.从Java 8开始,接口里允许定义默认方法。
 [public] default 返回值类型 方法名称(参数列表){
	方法体
}

注意

  • 默认方法也可以被覆盖重写
4.从Java 8开始,接口里允许定义静态方法。
 [public] static 返回值类型 方法名称 方法名称(参数列表){
	方法体
}

注意

  • 应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法
5.从Java 9开始,接口里允许定义私有方法。
 普通私有方法:
private 返回值类型 方法名称(参数列表){
    方法体
}

静态私有方法:
private static 返回值类型 方法名称(参数列表){
    方法体
}

注意

  • private的方法只有接口自己才能调用,不能被实现类或别人使用。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值