接口不能创建对象,但是可以被实现(`implements` ,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。
接口:是功能的集合(接口中定义的都是方法)
定义接口使用的也是.java文件;编译生成的也是.class文件
定义接口使用关键字interface
修饰符 interface 接口名 {
抽象方法;
默认方法; (JDK8以后新增)
静态方法; (JDK8以后新增)
}
接口的使用:
1.接口不能创建对象使用
2.可以定义一个实现类,实现(继承)接口,重写接口中的抽象方法,创建实现类对象使用
抽象方法:没有方法体,被abstract修饰的方法
默认的修饰符public abstract可以省略
public abstract 返回值类型 方法名(参数);
注意:
接口中的抽象方法修饰符是可以省略不写,不写默认也是public abstract
建议写出,增强阅读性
public interface MyInter {
//定义抽象方法
public abstract void show01();
public abstract int show02();
void show03(String s);
}
定义接口的实现类
使用格式:使用类实现接口,重写接口中的抽象方法
public class 实现类名 implements 接口{
重写接口中的抽象方法;
}
注意:
实现类似于继承,类实现接口,就可以继承接口中的所有非私有的成员
public class MyInterImpl implements MyInter{
@Override
public void show01() {
System.out.println("实现类重写接口中的show01抽象方法!");
}
@Override
public int show02() {
System.out.println("实现类重写接口中的show02抽象方法!");
return 0;
}
@Override
public void show03(String s) {
System.out.println("实现类重写接口中的show03抽象方法!"+s);
}
}
public class Demo01MyInter {
public static void main(String[] args) {
//接口不能创建对象使用 'MyInter' is abstract; cannot be instantiated
//MyInter mi = new MyInter();
//创建接口的实现类对象
MyInterImpl my = new MyInterImpl();
my.show01();
my.show02();
my.show03("赵四");
}
}
默认方法
定义格式:
修饰符 default 返回值类型 方法名(参数){
方法体;
}
注意:
默认方法的修饰符default不能省略
public interface MyInter {
public default void show01(){
System.out.println("MyInter接口中的默认show01方法");
}
public default void show02(){
System.out.println("MyInter接口中的默认show02方法");
}
}
- 含有默认方法的接口的使用:定义实现类,实现接口,选择性的重写默认方法,创建实现类对象使用
- 重写了默认方法:使用实现类重写后的方法
- 没有重写默认方法:使用继承自接口中的默认方法
注意:
实现类重写接口中的默认方法,去掉default修饰符
public class MyInterImpl implements MyInter{
@Override
public void show01() {
System.out.println("实现类重写了MyInter接口中的show01默认方法");
}
}
public class Demo01MyInter {
public static void main(String[] args) {
//创建接口的实现类对象
MyInterImpl my = new MyInterImpl();
my.show01();//实现类重写的
my.show02();//继承自接口的
}
}
静态方法
定义格式:
修饰符 static 返回值类型 方法名(参数){
方法体
}
注意:
-
-
-
- 定义静态方法不能省略static关键字
- 定义含有静态方法的接口使用:
- 静态成员属于类(接口),所以可以通过接口名.方法名(参数)直接使用
-
-
public interface MyInter {
public static void show01(){
System.out.println("MyInter接口的静态show01方法");
}
public static String show02(int a){
System.out.println("MyInter接口的静态show01方法"+a);
return "哈哈";
}
}
public class MyInterImpl implements MyInter{
//@Override//Method does not override method from its superclass
public static void show01(){
System.out.println("MyInterImpl类的静态show01方法");
}
}
静态方法只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用
静态方法是不能重写的,属于类|接口本身,也不能被实现类继承使用。在实现类中定义了静态方法,属于实现类本身
public class Demo01MyInter {
public static void main(String[] args) {
//通过接口名.方法名(参数)调用接口中的静态方法
MyInter.show01();
String s = MyInter.show02(10);
System.out.println(s);
MyInterImpl.show01();
}
}
接口的多实现
语法
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}
抽象方法
接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果多个接口中抽象方法有重名的,只需要重写一次。
默认方法
接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须重写一次。
静态方法
接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
优先级的问题
当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。
接口的多继承
- 接口的继承使用 `extends` 关键字,子接口继承父接口的方法。如果多个父接口中的默认方法有重名的,那么子接口需要重写一次
- 子接口重写默认方法时,default关键字可以保留。
- 子类重写默认方法时,default关键字不可以保留。
其他成员的特点
- 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。
- 接口中,没有构造方法,不能创建对象。
- 接口中,没有静态代码块。
抽象类和接口
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口, 接口弥补了Java的单继承
- 抽象类为继承体系中的共性内容, 接口为继承体系中的扩展功能