接口中的各类方法及其常量
接口
接口就是多个类的公共规范。
接口是一种引用数据类型,最重要的内容,就是其中的:抽象方法。
接口的格式:
public interface 接口名称{ //接口内容 }
接口中包含的内容
如果是Java 7,那么接口中可以包含的内容有:
- 常量(不能改变的量)
- 抽象方法
如果是Java 8,还可以额外包含有:
- 默认方法
- 静态方法
如果是Java 9,还可以额外包含有:
- 私有方法
接口中的抽象方法
注意事项:
- 接口中的抽象方法,修饰符必须是两个固定的关键字:public abstract
- 这两个关键字修饰符,可以选择性的省略。
public interface MyInterfaceAbstract { public abstract void methodAbs(); abstract void methodAbs1(); public void methodAbs2(); void methodAbs3(); }//这些都是抽象方法,因为可以省略的
接口的使用步骤(类比着抽象类)
- 接口不能直接使用,必须有一个“实现类”来“实现”该接口。//写法跟继承有些类似,把extends换成implements即可
public class 实现类名称 implements 接口名称{ //... }
- 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
- 创建实现类的对象,进行使用。//接口对象无法创建,就像是抽象类对象无法直接创建一样(需要继承了抽象类的子类创建一个意思)
注意:
如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。(和抽象类,抽象对象一个意思)
接口中的默认方法
从Java 8开始,接口里允许定义默认方法。
默认方法格式:
public default 返回值类型 方法名称(参数列表){ 方法体//抽象方法没有方法体和{},默认方法有 }//在这里public可省略
备注:接口当中的默认方法,可以解决接口升级的问题。(因为如果你想要向接口中添加别的功能的话,就只能添加抽象方法,但是如果添加抽象方法的话,就要保证每个抽象方法都必须被覆盖重写才行,那么就需要修改该接口对应的每个实现类,因为每个实现类中要保证所有抽象方法的覆盖重写(已测试,否则会报错)。就会很麻烦,添加默认方法应运而生)
使用方法:在接口中加入默认方法即可,就可以通过该接口的实现类对象,调用该默认方法。
- 接口的默认对象,可以通过接口实现类对象,直接调用。
- 接口的默认方法,也可以被接口实现类进行覆盖重写。
接口: 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开始,接口当中允许定义私有方法。
- 普通私有方法,解决多个默认方法之间重复代码问题
格式: 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"); }
- 静态私有方法,解决多个静态方法之间重复代码问
格式: 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关键字进行修饰,说明不可改变。
- 接口当中的常量,可以省略public static final,但不写也照样是指常量。
- 接口当中的常量,必须进行赋值,不能不赋值。
- 接口中的常量名称,使用完全大写的字母,用下划线进行分隔。(推荐命名规则)
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的方法只有接口自己才能调用,不能被实现类或别人使用。