- 接口是一种引用数据类型,编译之后也是一个class字节码文件。
- 接口是完全抽象的。(抽象类是半抽象。)
或者也可以说,接口是特殊的抽象类 - 接口怎么定义?语法是什么?
[修饰符列表] interface 接口名 {
}
- 接口支持多继承,一个接口可以继承多个接口。
- 接口中只有:常量,抽象方法。
接口中没有其他内容了。 - 接口中所有的元素都是public修饰的。(都是公开的)
- 接口中的抽象方法定义时:public abstract修饰符可以省略
- 接口中的常量的public static final可以省略
- 接口中的方法都是抽象方法,所以接口中的方法不能有方法体
public class Test01 {
public static void main(String[] args) {
System.out.println(MyMath.PI);
//常量能重新赋值吗?
MyMath.PI = 3.1415928;
//错误:无法为最终变量PI分配值
//定义接口
interface A {
}
//接口支持继承
interface B extends A{
}
//一个接口可以继承多个接口 (直接多继承)
interface C extends A, B {
}
interface MyMath {
//常量
public static final double PI = 3.1415926;
public abstract int sum(int a, int b); //抽象方法
//接口当中既然都是抽象方法,那么在编写代码的时候,public abstract可以省略吗
int sum2(int a, int b);
}
//接口中的方法可以有方法体吗?不能
//void doSome() {
}
- 类和类之间叫做继承,类和接口之间叫做实现。
别多想:仍然可以将”实现“看做”继承“
继承:extends
实现:implements - 五颗星*******:当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖)
能使用多态吗?可以
public class Test02 {
public static void main(String[] args) {
Animal a = new Cat();
Mymath mm = new MyMathImpl();
//调用接口里面的方法(面向接口编程)
mm.
}
}
接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?
对于计算机来说,一个机箱上有多个接口,一个接口是按键盘的,
一个接口的接鼠标的,一个接口是接电源的,一个接口是接显示器的
重点*****:一个类可以同时实现多个接口
这种机制弥补了java中的哪个缺陷?
java中类和类只支持单继承,实际上单继承是为了简单而出现的,现实世界中存在多继承,java中的接口弥补了单继承带来的缺陷
interface A{
void m1();
}
interface B{
void m2();
}
interface C{
void m3();
}
//实现多个接口,其实就类似于多继承
class D implements A,B,C{
public void m1(){
}
public void m2(){
}
public void m3(){
}
}
public class Test03{
public static void main(String[] args) {
//多态
//此处都是父类型引用指向子类型对象
A a = new D();
B b = new D();
C c = new D();
//这个编译没问题,运行也没问题
B b2 = (B)a;
b2.m2();
M m = new E();
K k = (K)m;
//这个编译没问题,运行有问题
}
}
interface K{
}
interface M{
}
class E implements M{
}
经过测试:接口和接口之间在进行强制类型转换的,没有继承关系,也可以强转。
但是一定要注意,运行时可能会出现ClassCastException异常
接口A和接口B虽然没有继承关系,但是写代码的时候,可以互转,编译器没意见,但是运行时可能出现:ClassCastException异常
之前有一个结论:
无论向上转型还是向下转型,两种类型之间必须要有继承关系,
没有继承关系,编译器会报错。(这句话不适用在接口方面)
最终实际上和之前还是一样,需要加:instanceof运算符进行判断
向下转型养成好习惯,转型之前先if+instanceof进行判断
if(m instanceof K) {
K k = (K)m;
} //因为m不是K,所以大括号里面的内容没有执行
仅供学习使用,内容版权归B站老师所有。