接口的概述
接口就是一种公共的规范标准
只要符合规范标准,就可以通用
接口定义的基本格式
接口就是多个类的公共规范
接口是一个引用数据类型,最重要的内容就是其中的抽象方法
定义一个接口的格式:
public interface 接口名称
{
//接口内容
}
备注:换成关键字interface之后,编译生成的字节码文件仍然是,.java–>.class
java7接口包含内容:常量,抽象方法
java8可以额外包括:默认方法静态方法
java9还可以包含:私有方法
接口使用步骤:
1 接口不能直接使用,必须要有一个“实现类”来“实现”该接口
public class 实际类名称 implements 接口名称
{
}
2接口的实现类必须覆盖重写(实现)接口中所有抽象方法
实现:去掉abstract关键字,加上方法体大括号
3 创建实现类的对象,进行使用
抽象方法
//格式:public abstract 返回值类型 方法名称(参数列表);
//注意事项:
//1 接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
//2 这两个关键字修饰符,可以选择性省略
//接口
public interface MyInterfaceAbstract
{
public abstract void methodAbs();
//public void methodAbs1();
// abstract void methodAbs2();
//void methodAbs3();
}
//抽象类的实现对象
public class MyInterfaceAbstractImp1 implements MyInterfaceAbstract
{
@Override
public void methodAbs()
{
System.out.println("抽象方法");
}
}
//创建实现类的对象
public class Demo
{
public static void main(String[] args)
{
MyInterfaceAbstractImp1 imp1=new MyInterfaceAbstractImp1();
imp1.methodAbs();
}
}
默认方法
//方法定义
/*
从java 8开始,接口里允许定义默认方法
格式:
public default 返回值类型 方法名称(参数列表){
方法体
}
备注:接口当中的默认方法,可以解决接口升级的问题
*/
public interface MyInterfaceDefault
{
public abstract void methodAbs();
public default void methodDefault()
{
System.out.println("默认方法");
}
}
实现类a
public class MyInterfaceDefaultA implements MyInterfaceDefault
{
@Override
public void methodAbs()
{
System.out.println("抽象方法a");
}
}
实现类b
public class MyInterfaceDefaultB implements MyInterfaceDefault
{
@Override
public void methodAbs()
{
System.out.println("抽象方法b");
}
public default void methodDefault()
{
System.out.println("默认方法b");
}
}
}
//1 接口的默认方法,可以通过接口实现类对象,直接调用
//2 接口的默认方法,也可以被接口实现类覆盖重写
public class Demo2
{
public static void main(String[] args)
{
MyInterfaceDefaultA a=new MyInterfaceDefaultA();
a.methodAbs();//实际上在调用右侧实现类
a.methodDefault();//调用默认方法,如果实现类中没有,那么向上找接口
MyInterfaceDefaultB b=new MyInterfaceDefaultB();
b.methodDefault();
}
}
静态方法
/*
格式:public static 返回值类型 方法名称(参数列表)
{
方法体
}
*/
public class MyInterfaceStatic
{
public static void methodStatic()
{
System.out.println("这是一个静态方法");
}
}
public class MyInterfaceSaticImp1 implements MyInterfaceStatic
{
}
/*
注意:不能通过接口实现类来调用接口当中的静态方法
格式 接口名称.静态方法名(参数);
*/
public class demo
{
public static void main(String[] args)
{
MyInterfaceStatic.methodStatic();
}
}
私有方法
/*
定义私有方法;
1 普通私有方法:解决多个默认方法之间重复代码问题
格式:private 返回值类型 方法名称(参数列表)
{
方法体;
}
2 静态私有方法:解决多个静态方法之间重复代码问题
格式:private static 返回值类型 方法名称(参数列表)
{
方法体;
}
*/
public interface MyInterfacePrivateA
{
public default void methodDefault1()
{
System.out.println("默认方法1");
}
public default void methodDefault2()
{
System.out.println("默认方法2");
}
private void methodCommmon()
{
System.out.println("aaa");
}
}
public class MyInterfacePrivateAImp1 implements MyInterfacePrivateA
{
}
接口中常量的定义和使用
/*
接口当中也可以定义“成员变量”,但必须使用public static final三个关键字进行修饰。
从效果上看,这其实就是接口的常量
格式 public static final 数据类型 常量名称=数据值;
final修饰不可改变
注意:接口中变量必须赋值
*/
public interface MyInterfaceConst
{
public static final int num=10;
//一旦赋值,不可修改
}
接口总结
1 成员变量其实是常量,格式:
[public] [static] [final] 常量名称=数据值;
注意:
常量必须赋值,一旦赋值不可改变
常量名称大写,用下划线分割
2 抽象方法
[public][abstract] 返回值类型 方法名称(参数列表);
注意:实现类要重写抽象方法
3 默认方法
public default 返回值类型 方法名称(参数列表)
{方法体}
注意 默认方法可以被覆盖重写
4 静态方法
【public】static 返回值类型 方法名称(参数列表) {方法体}
注意 应该通过接口名称进行调用
5 私有方法
private 返回值类型 方法名称(参数列表) {方法体}
private static 返回值类型 方法名称(参数列表) {方法体}
只有接口自己调用
继承父类并实现多个接口
接口不能有静态代码快和构造方法
一个类可以实现多个接口
多个接口中覆盖抽象方法重复,只用复写一个
如果没有实现所有抽象方法,那么实现类一定是抽象类
如果接口中默认方法冲突,那么一定要重写冲突方法
一个类如果直接父类当中的方法,和接口中的默认方法产生了冲突,优先使用父类当中的方法
接口中的多继承
1 类与类之间是单继承的,直接父类只有一个
2 类与接口之间是多实现的,一个类可以实现多个接口
3 接口和接口之间是多继承的
一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。
接口的继承使用 extends 关键字,子接口继承父接口的方法。
如果父接口中的默认方法有重名的,那么子接口需要重写一次。(带着default关键字)