接口(interface)
接口的基础语法:
接口介绍:
-
接口也是一种引用数据类型 。编译之后也是一个class字节码文件。
-
接口是完全抽象的。(抽象类是半抽象) 或者也可以说接口是特殊的抽象类。
-
接口怎么定义的,语法是什么?
[修饰符列表] interface 接口名{}
-
接口支持多继承,一个接口可以继承多个接口。
-
一般情况下接口只包含两部分内容。一部分是:常量,一部分是:抽象方法。
-
一般情况下接口中的所有元素都是public修饰的。(都是公开的。)
-
接口中的抽象方法定义时:public abstract修饰符可以省略。
-
接口中定义常量时:public static final 可以省略。
-
一般情况下接口中的方法都是抽象方法,所有接口中的方法不能有方法体。
代码演示:
public class Test01{
public static void main(String[]args){
//访问接口的常量
System.out.println(MyMath.PI);
//错误: 无法为最终变量PI分配值
//MyMath.PI=3.1415928;
}
}
//我的数学接口
interface MyMath{
//常量
// public static final double PI=3.1415926;
//接口中public static final 可以省略 如:
double PI=3.1415926;
//再如:
int k=100; //接口中随便写一个变量就是常量:值不能发生改变的变量。
//抽象方法
//接口中既然都是抽象方法,那么public abstract在编写时可以省略
//public abstract int sum(int a,int b);
int sum(int a,int b);
// 接口抽象方法不能带有主体
// void dosome(){} 错误
//相减的抽象方法
int sub(int a,int b);
}
接口多继承:
- 类与类之间是单继承。之间父类只有一个。
- 类与接口之间是多实现,一个类可以实现多个接口。
- 接口与接口之间是多继承。
- 注意:
- 多个父接口中的抽象方法如果重复,没有关系。
- 多个父接口中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且要带着default关键字。
//定义接口
interface A{
public abstract void methodA();
public abstract void methodCommon();
public default void methodDefault(){
System.out.println("接口A默认方法");
}
}
//定义接口
interface B{
public abstract void methodB();
public abstract void methodCommon();
public default void methodDefault(){
System.out.println("接口B默认方法");
}
}
//定义接口 接口可继承接口 支持多继承
//这个接口中有4个方法
/*
methodA():来自于接口A
methodB():来自于接口B
methodCommon():同时来自于接口A,B
methodA():来自于自己
*/
interface C extends A,B{
public abstract void method();
//重写重复的默认方法
@Override
default void methodDefault() {
}
}
接口实现(implements):
-
类和类之间叫做继承,类和接口之间叫做实现。(仍然可以将实现看做’继承’)
继承关键字:extends。
实现关键字:implements
-
当一个非抽象的类实现接口的话,必须重写接口中所有的抽象方法。重写后方法的修饰符必须为public,若方法名重复,重写一次即可。
-
如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类必须是一个抽象类。
-
一个类可以同时实现多个接口。java中的接口弥补了单继承带来的缺陷。
-
当运用多态创建对象,调用其他接口可能会出现的问题:
-
如下(类实现多接口演示中),接口K和M虽然没有继承关系,但编写代码的时候,可以互转。编译器没意见,但是运行时可能出现ClassCastException异常。
-
之前有一个结论:
无论向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系,编译器会报错。(但这句话不适用在接口方面)。但实际上和之前还是一样,需要:if+instanceof运算符进行判断。
-
代码演示:
public class Test02{
public static void main(String[]args){
//使用多态
MyMath m=new MyMathImpl();
System.out.println( m.sum(10,9));
System.out.println( m.sub(10,9));
}
}
//数学接口
interface MyMath{
double PI=3.1415926;
//求和方法
int sum