Java基础(12)接口

十二.接口

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

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

一.接口的基本语法

1.语法

interface 接口名{

}

a.接口名命名规范  按照类的命名规范进行命名  所有单词首字母均大写

2.接口与抽象类的区别   阶段性面试

(1)相同点:

a.编译后都会生成相应的.class文件

b.抽象类与接口 只能被声明,不能被实例化

(2)不同点:

a.接口没有构造方法

b.接口中所有的方法  一定是  公开  抽象方法(public  abstract 修饰) 

接口中  方法默认的修饰符是public abstract 如果缺少编译器会自动补齐

注意:类中的方法不写修饰符  默认的是 默认级别访问权限修饰符

          而接口中的方法不写修饰符  默认的是 public abstract

c.接口中 可以定义属性,接口中的属性一定是公开静态常量(public static final 所修饰),

接口中属性的默认修饰符是public static final ,而不是  默认的  访问权限修饰符,无论缺少哪个,

编译器都会讲public static final 补齐

二.接口的实现

1.语法

class 类名  implements 接口名{

     

}

例:

注意事项:

a.接口与类之间的关系被称为 实现,与抽象类和其子类的关系类似

b.父类引用指向子类对象被称为多态,有了接口之后 接口类型指向实现类对象,也是多态

MyClass2 mc=new Sub2();

注意:

(1)一个实现类如果没有实现接口中所有的抽象方法,那么该类仍旧是一个抽象类

(2)在实现一个接口时,需要注意实现其方法,访问权限修饰符一定是public,

因为接口中的抽象方法一定是公开的

2.多实现

语法:

class  类名  implements 接口名1,接口名2,接口名3...{

}

例:

注意:多实现的场景下,一个实现类如果没有实现接口中所有的抽象方法,那么该实现类会是一个抽象类

3.实现多个接口的情况下  同时 继承一个父类

语法:

class 类名 extends 父类 implements 接口名1,接口名2,接口名3...{

}

例:

三.接口之间的多继承

1.语法:

接口与接口之间的关系  多继承 —— 一个接口可以继承多个接口

interface 接口名 extends 接口名1,接口2,接口3...{

}

当一个接口 继承多个接口时,会同时继承多个接口中的方法

2.接口多继承后的多态关系

有了接口之后,多态的语法大致分为以下这些情况

MyClass mc =new MyClass();

(1)父类引用  指向  子类对象

Super s=mc;

(2)接口类型的引用 指向 实现对象

InterfaceC inc = mc;

(3)父接口类型的引用  指向 子接口类型的引用

InterfaceA ina = inc;

(4)父接口类型的引用  指向  子接口类型实现类的对象

InterfaceA ina = mc;

以下是案例中,接口与类   接口与接口之间的关系

3.接口多继承之后的类型转换

(1)自动类型转换

目标类型  是  原类型的父类,所实现的接口类型 ,父接口类型——小转大

例:

MyClass mc = new MyClass();

//自动类型转换

Super s=mc;

InterfaceC  inc =mc;

InterfaceE  ine =mc;

InterfaceA  ina =mc;

InterfaceA  ina2 =inc;

(2)强转类型转换

对于类与类之间,原类型是目标类型的父亲类型,可以发生强转

如果接口类型参与类型转换,无论接口类型是目标类型还是原类型,只要使用强转语法均可通过编译

(有了接口之后,接口与接口 , 类与接口之间的关系过于复杂,编译器不再进行检查)

a.强转成功  原类型中所存储的对象  与目标类型兼容时

b.强转失败  原类型中所存储的对象  与目标类型不兼容时

如果强转失败,会出现  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)接口与接口  多继承(一个接口可以继承多个接口)

四.接口的好处

1.多继承

弥补java中  类与类之间单继承的缺陷,将主要功能通过继承来实现,次要功能 附加功能 通过接口的多继承  多实现来完成,

从而提高了代码的可拓展性

2.配合多态进行解耦合

依赖倒置原则     两个类之间的关系   应该建立在抽象上  而不应该建立在具体上

两个类之间的关系   应该建立在接口上 ,而接口是一种标准和规范,标准和规范实际上就是抽象的

配合着多态的语法,可以达到两个类解耦的效果,两个类之间有中间的接口来维持关系,一个类中使用了接口类型,

被称为接口的使用者,一个类实现了接口,被称为接口的实现者

3.接口的回调

弥补java中不存在函数回调的现象,java使用接口回调代替函数回调,使得一个逻辑可以作为参数传递到方法中,使得代码更具通用性

五.JDK1.8之后的接口

1.接口中的默认方法

语法:

使用dafault来修饰一个接口中方法时,该方法需要写方法体,且该方法可以被所以实现类共有 ,类似于继承

interface InterfaceA{

     void m1();

     default void m2(){

            System.out.println("这是InterfaceA的默认方法m2);   

     }

}

注意:

a.默认方法,也一定是公开的,默认的访问权限修饰符是public

b.注意,一个类可以实现多个接口,多个接口中可能会存在方法名一致的情况,

那么需要保证这些方法的语法能够形成方法的承载,否则会编译失败

c.如果  一个类实现多个接口时,多个接口中有命名相同但没形成重载的方法时,可以用以下方式解决

(1)第一步,将这些方法的声明  变为一致  返回值类型  参数表   方法名  均一致

(2)在实现类中 重写该方法

(3)在重写的方法中   可以使用  接口名.super.方法名()的语法  指定调用接口中哪一个重名方法

2.接口中的静态方法

使用static修饰一个方法,该方法需要写方法体,并且可以通过   接口名.方法名()  进行调用

interface InterfaceA{

     int A=10;

     void m1();

     default void m2(){

           System.out.println("这是InterfaceA的默认方法m2);

     }

     static void testStatic(){

          System.out.println("这是InterfaceA的静态方法testStatic");

     }

}

调用:

public static void main(String【】 args){

     MyClass1 mc = new MyClass1();

     mc.m2();

     InterfaceA.testStatic();

     System.out.println(InterfaceA.A);

}

注意:a.静态方法的访问权限修饰符,也一定是公开的,当不写时默认的也是public

六.接口的分类

 根据接口中的内容 对接口进行分类

1.常量接口: 接口中   没有抽象方法,全部是公开静态常量   很少用

2.标记接口: 空接口   什么都没  仅仅作为一个标记

3.普通接口: 包含了多个抽象方法  以及   公开静态常量

4.函数接口: 只有一个抽象方法—— 搭配Lambda表达式使用

@FunctionlInterface——讲这个注解放置在接口上,编译器会帮助我们检查接口是否是个函数式接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值