接口interface

it2025-04-15  4

接口

接口 是一组规范和标准 接口的使用者与接口的实现者 都要遵循接口的标准与规范

接口 站在语法的角度 如果一个抽象类中都是抽象方法 那么我们可以将该抽象类声明成一个接口

一.接口的基本语法

1.语法
interface 接口名{ } a.接口名命名规范 按照类的命名规范进行命名 所有单词首字母均大写
2.接口与抽象类的区别
1.相同点 a.编译后都会生成对应的.class文件 b.抽象类与接口 只能被声明 不能被实例化 2.不同点 a.接口没有构造方法 b.接口中所有的方法 一定是公开 抽象方法(public abtract修饰) 接口中 方法默认的修饰符是public abstract 如果缺少编译器会自动补齐 注意:类中的方法不写修饰符 默认的是 默认级别访问权限修饰符 接口的方法不写修饰符 默认的是 public abstract c.接口中可以定义属性,接口中的属性一定是公开静态常量(public static final 所修饰),接口中属性的默认修饰符是public static final,而不是 默认的访问权限修饰符,无论缺少哪个,编译器都会将public static final补齐

二.接口的实现

1.语法
class 类名 implements 接口名{ } 例: interface MyClass2{ public static final int A = 10; public abstract void m1(); public abstract void m2(); } class Sub2 implements MyClass2{ public void m1(){ } public void m2(){ } } a.接口与类之间的关系被称为实现, 与抽象类和其子类的关系类似 b.父类引用指向子类对象被称为多态 有了接口之后 接口类型指向实现类对象也是多态 MyClass2 mc = new Sub2(); 注意: 1.一个实现类如果没有实现接口中所有的抽象方法,那么该类仍旧是一个抽象类 2.在实现一个接口时,需要注意实现其方法,访问权限修饰符一定是public,因为接口中的抽象方法一定是公开的
2.多实现
语法: class 类名 implements 接口名1,接口名2,接口名3....{ } 例: class MyClass implements InterfaceA,InterfaceB,InterfaceC,InterfaceD,InterfaceE{ public void m1(){ System.out.println("这是InterfaceA的m1方法"); } public void m2(){ System.out.println("这是InterfaceB的m2方法"); } public void m3(){ System.out.println("这是InterfaceC的m3方法"); } public void m4(){ System.out.println("这是InterfaceD的m4方法"); } public void m5(){ System.out.println("这是InterfaceE的m5方法"); } } 注意:多实现的场景下,一个实现类如果没有实现接口中所有的抽象方法,那么该实现类会是一个抽象类
3.实现多个接口的情况下 同时 继承一个父类
语法: class 类名 extends 父类 implements InterfaceA,InterfaceB,InterfaceC,InterfaceD,InterfaceE{ } 例: class MyClass extends Super implements InterfaceA,InterfaceB,InterfaceC,InterfaceD,InterfaceE{ public void m1(){ System.out.println("这是InterfaceA的m1方法"); } public void m2(){ System.out.println("这是InterfaceB的m2方法"); } public void m3(){ System.out.println("这是InterfaceC的m3方法"); } public void m4(){ System.out.println("这是InterfaceD的m4方法"); } public void m5(){ System.out.println("这是InterfaceE的m5方法"); } public void m6(){ System.out.println("这是覆盖 Super 的m6 方法"); } }

三.接口之间的多继承

1.语法
接口与接口之间的关系 多继承 一个接口可以继承多个接口 interface 接口名 extends 接口名1,接口名2,接口名3.....{ } 当一个接口 继承多个接口时 会同时继承多个接口中的方法
2.接口多继承后的多态关系
有了接口之后 多态的语法大致分为以下这些情况 MyClass mc = new MyClass(); 1.父类引用指向子类对象 Super s = mc; 2.接口类型的引用 指向 实现类对象 InterfaceC inc = mc; 3.父接口类型的引用 指向 子接口类型的引用 InterfaceA ina2 = inc; 4.父接口类型的引用 指向 子接口类型实现类的对象 InterfaceA ina = mc; 以下是案例中 接口与类 接口与接口之间的关系 interface InterfaceA{ void m1(); } interface InterfaceB{ } void m2(); interface InterfaceC extends InterfaceA,InterfaceB{//父接口 void m3(); } interface InterfaceD{ void m4(); } interface InterfaceE extends InterfaceD{ void m5(); } class Super{ public void m6(){ System.out.println(" Super的m6方法"); } } class MyClass extends Super implements InterfaceC,InterfaceE{ public void m1(){ System.out.println("这是InterfaceA的m1方法"); } public void m2(){ System.out.println("这是InterfaceB的m2方法"); } public void m3(){ System.out.println("这是InterfaceC的m3方法"); } public void m4(){ System.out.println("这是InterfaceD的m4方法"); } public void m5(){ System.out.println("这是InterfaceE的m5方法"); } public void m6(){ System.out.println("这是覆盖 Super 的m6 方法"); } }
3.接口多继承之后的类型转换
1.自动类型转换 目标类型 是 原类型的父类 所实现的接口类型 父接口类型 小转大 例: MyClass mc = new MyClass(); //自动类型转换 Super s = mc; InterfaceC inc = mc; InterfaceE ine = mc; InterfaceA ina = mc; InterfaceA ina2 = inc; 2.强制类型转换 对于类与类之间,原类型是目标类型的父类类型 可以发生强转 如果接口类型参与类型转换,无论接口类型是目标类型还是原类型,只要使用强转语法均可以通过编译 (有了接口之后 接口与接口 类与接口之间的关系过于复杂,编译器不在进行检查) 1.强转成功 原类型中所存储的对象 与目标类型兼容时 InterfaceC inc = mc; Super s = (Super)inc;//true InterfaceE ine = (InterfaceE)inc;//true InterfaceD ind = (InterfaceD)inc;//true MyClass mc2 = (MyClass)inc;//true System.out.println(mc instanceof Super); System.out.println(mc instanceof InterfaceE); System.out.println(mc instanceof InterfaceD); System.out.println(mc instanceof MyClass); 2.强转失败 原类型中所存储的对象 与目标类型不兼容时 Super s2 = new Super(); System.out.println(s2 instanceof Super); System.out.println(s2 instanceof InterfaceE); System.out.println(s2 instanceof InterfaceD); System.out.println(s2 instanceof MyClass); //InterfaceE ine = (InterfaceE)s2; //InterfaceD ind = (InterfaceD)s2; ///MyClass mc2 = (MyClass)s2; 如果强转失败 会出现 java.lang.ClassCastException 类型转换异常 3.A与B是否兼容 在有了接口之后的变化 如果B是A的父类 或B是A的接口类型 或B是A的父接口类型 或B与A 一致 那么我们称A与B兼容 a引用 instanceof b类型 关键字依然可以用来检查 一个引用中所存的对象是否和某个类型兼容 但是需要注意,如果a引用的类型 或 b类型 有一个是接口类型时,instanceof 均不会进行编译时的验证 (有了接口之后 接口与接口 类与接口之间的关系过于复杂,编译器不在进行检查)
3.小结
1.接口和类之间 多实现(一个类可以实现多个接口) 2.类和类之间 单继承(一个类只能有一个直接父类) 3.接口与接口 多继承(一个接口可以继承多个接口)
最新回复(0)