接口
接口
接口就是一种公共的规范标准,只要符合规范标准,大家就能通用。
一、接口定义的基本格式
- 接口是多个类的公共规范
- 接口是一种引用数据类型,最重要的内容就是其中的抽象方法。
- public interfaces name{ }
备注:换成了interface后,编译生成的字节码文件也是.class
接口中可以包含的内容有:常量、抽象方法(java 7) 默认方法、静态方法(java 8) 私有方法(java 9)
public interface Demo{
}
二、接口中的抽象方法定义
- 在任何版本的jdk中都能定义抽象方法。
- 抽象方法格式: public abstract 返回值 methodName();
注意事项:
- 接口当中的抽象方法,修饰符必须是两个固定的关键字,public abstract.
- 这两个关键字可以选择性省略。
- 方法的三要素,可以随意选择。
public interface InterfaceDemo{
public abstract void methodAbs1();
public abstract void methodAbsb();
void methodAbsa();
}
三、接口使用步骤
-
接口不能直接使用,必须有一个实现类实现该接口。
-
接口的实现类必须重写,接口的所有抽象方法。
-
创建实现类的对象,进行使用。
注意事项:
如果实现类没有重写所有的接口抽象方法,那么实现类必须是抽象类
public class InterfaceDemoImpl implements InterfaceDemo{
public void methodAbs1(){};
public void methodAbsb(){};
public void methodAbsa(){};
}
四、接口的默认方法定义
java 8 开始,接口里允许定义默认方法
**格式:**public default 返回值类型 methodName(){}
**备注:**解决接口升级问题
//接口
public interface InterfaceDemo{
public abstract void methodAbs1();
public abstract void methodAbsb();
void methodAbsa();
}
//实现类A
public class InterfaceDemoImplA implements InterfaceDemo{
public void methodAbs1(){};
public void methodAbsb(){};
public void methodAbsa(){};
}
//实现类B
public class InterfaceDemoImplB implements InterfaceDemo{
public void methodAbs1(){};
public void methodAbsb(){};
public void methodAbsa(){};
}
}
**本来已经写好接口和实现类。因为某种原因,接口中新增了新的抽象方法。则实现类会出错。**为了保证接口更改而不影响实现类,则使新增的抽象带有默认的方法体,即默认方法。
五、默认方法的使用
public interface InterfaceDemo{
public abstract void methodAbs1();
public abstract void methodAbsb();
void methodAbsa();
//新添加的默认方法
public default void methodDefault(){
System.out.println("默认方法");
}
}
默认方法会被实现类继承下去。
public class InterfaceDemoImpl implements InterfaceDemo{
public void methodAbs1(){};
public void methodAbsb(){};
public void methodAbsa(){};
}
public class Demo {
public static void main(String[] args){
interfaceDemoImpl interfaceDemo = new interfaceDemoImpl();
interfaceDemo.methodAbs1();
interfaceDemo.methodDefault();//--》默认方法
}
}
-
接口的默认方法,可以被实现类继承
-
接口的默认方法,可以被实现类覆盖重写
六、接口的静态方法定义和使用
1.定义
java 8开始,接口中允许定义静态方法
格式:public static 返回值类型methodName(参数列表){方法体}
2.使用
静态和对象没有关系,和类(接口)有关系
public interface MyinterfaceStatic{
public static void methodStatic(){
System.out.println("静态方法");
}
}
public class MyinterfaceStaticImpl implement MyinterfaceStatic{
}
public class Demo3Interface{
MyinterfaceStaticImpl impl=new MyinterfaceStaticImpl();
//通过接口名称调用静态方法
MyinterfaceStatic.methodStatic();
}
七、接口中的私有方法定义和使用
(一)定义
问题描述:默认方法中有重复代码,抽离出来之后,又不想让实现类访问抽离出来的方法。
解决方法:java9开始允许定义私有方法
普通私有方法,解决多个默认方法之间有重复代码问题
格式:private 返回值类型 methodName(参数列表){}
**静态私有方法,**解决多个静态方法之间重复代码的问题。
格式:private static 返回值类型 methodName(参数列表){}
public interface MyInterfacePrivateA{
public default void methodDefault1(){
System.out.println("default方法1");
// System.out.println("重复代码");
methodDefault3();
}
public default void methodDefault2(){
System.out.println("default方法2");
//System.out.println("重复代码");
methodDefault3();
}
private void methodDefault3(){
System.out.println("重复代码");
}
//修改带有重复代码的方法,让其调用私有方法即可
}
(二)使用
public class MyInterfacePrivateAImpl implements MyInterfacePrivateA{
MyInterfacePrivateAImpl impl=new MyInterfacePrivateAImpl();
}
静态方法
public interface MyInterfacePrivateA{
public static void methodStatic1(){
System.out.println("default方法1");
// System.out.println("重复代码");
methodStatic3();
}
public static void methodStatic2(){
System.out.println("default方法2");
// System.out.println("重复代码");
methodStatic3();
}
private static void methodStatic3(){
System.out.println("重复代码");
}
//修改带有重复代码的方法,让其调用私有方法即可
}
八、接口的常量定义和使用
接口当中也可以定义成员变量,但是必须使用 public static final 三个关键字修饰,[这三个关键字可以省略]从效果上看,这其实就是接口的常量。
**格式:**public static final Datatype Name = value;
注意事项:
- public static final 这三个关键字可以省略。
- 接口中的常量必须进行赋值。
- 接口中常量必须大写,下划线分割
public interface MyInterfaceConst{
public static final int NUM=0;
}
public class Demo{
public statci void main(String [] args){
int i= MyInterfaceConst.NUM;
}
}
九、接口内容小结
java 9 +版本:
1.成员变量其实是常量。
2.接口中最重要的是抽象方法,格式 public abstract 返回值类型 名称(参数列表);
3.java 8 开始有默认方法。可以被覆盖重写,public default 返回值类型 名称(参数列表){方法体}
4…java 8 开始有静态方法。public static 返回值类型 名称(参数列表){方法体},通过接口调用。
5.java 9开始允许定义私有方法,private static/空 返回值类型 名称(参数列表){方法体}
注意:
- 接口 没有静态代并且接口不能写构造方法
- 一个类的父类是唯一的,但是可以同时实现多个接口。class Demo implements Interface A,InterfaceB{}
- 如果实现类实现的多个接口中有重复的抽象方法,则只需要实现一次。
- 如果实现类没有覆盖重写所有接口中的抽象方法,则实现类必须是抽象类。
- 如果实现类实现的多个接口中有重复的默认方法,则实现类必须对默认方法进行重写。
- 一个类如果直接父类当中的方法,和接口当中的方法产生了冲突,则使用父类当中的方法(继承优先于接口)。
十、类和接口之间的关系
- 类与类之间是单继承的,直接父类只有一个。
- 类与接口之间是多实现的,一个类可以实现多个接口。
- 接口与接口之间是多继承的:public interface InterfaceC extends InterfaceA, InterfaceB{ }。
注意事项:
- 多个父接口的抽象方法如果重复,没有影响
- 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的重写,而且带着default关键字。
上一篇: 基于Docker的MongoDB实现授权访问的方法
下一篇: 201312-2ISBN号码