美文网首页
接口、多态

接口、多态

作者: 荆棘鸟_88d0 | 来源:发表于2018-09-10 18:36 被阅读0次

    接口(interface)

    1、接口是什么

    就相当于同一个地区中的一个插座,开放了插口,只要有电器想要通电,都可以用它插头插入到插口中。接口,就相当于一个规范一样。

    接口的核心作用:解耦合,将组件之间的耦合度降低。

    原先,在团队开发中,如果要实现一个功能的话,需要指定一个开发者在某个指定的类写中一个方法来实现,然后需要调整的时候又要从头开头开始分析,会影响到当前开发者的工作。现在,需要实现一个功能很简单。按模块分开进行开发,每人负责一个内容,这个内容只需要某个工程师熟悉即可,实现功能之后提供接口给其他同事使用即可,如果有问题,只需要负责的工程师调试即可。其他人都不需要理会,只需要负责自己的业务逻辑即可。

    2、 接口也是一种类型

    与抽象类,几乎一样。但它比抽象类,还要抽象。接口是功能的集合,也可以看做是一种数据类型。

    3、接口的使用方式 

    使用接口,需要提供一个接口类,使用 interface 修饰。 另外还需要提供一个实现类,用于实现接口。使用 implements 关键字实现指定的接口。接口中的方法,只提供方法声明,不提供方法的实现细节。即接口不能被实例化。为了安全,不向外提供方法实现,只需要返回对应结果即可。

    4. 接口的好处

    因为方法也可以认为是功能,功能的定义可以与实现进行分离。当功能的细节需要进行更改的时候,我们不需要去修改方法的定义。我们只需要去对应的实现中进行更新即可。

    好处就是,方法的调用者不需要针对功能改变而改变方法的调用。

    5、宗旨

            一切事物都有功能(方法),每个功能都需要把定义和实现进行分离,也就是说,一切事物都有接口。

    6、接口的初始化

    因为接口中没有实现,new 了之后得不到需要的实现细节,所以不能 new。我们需要初始化实现类,然后可以使用接口类型的变量接收实例。

    7. JDK9 接口的新特性

    使用 default 关键字来修饰接口定义,可以设置默认值,可以不用强制在实现类中实现。如果需要覆盖默认值的话,重写方法即可。

    8、接口的多个实现类

    在前面,我们学习的继承,只能够是单继承,不能是多继承。

    使用了接口,其实可以在一定情况下,弥补了不能多继承的缺点。

    【可能出现的问题】在实现的时候,我们需要同时实现所有接口中必须要重写的方法。而且,要花很多精力来处理好不同接口之间方法的关系,和详细逻辑,调用的时候容易出现混乱。

    【解决方案】尽量在继承父接口后的子类中,使用额外的方法体来处理整个需要获取的数据。做到整合使用。

    步骤如下:

    1. 需要重写方法,没有关系,直接重写即可。

     2. 最好添加一些容易识别的方法,共调用者使用,获取对应的数据即可。

     9 、 接口和抽象类的区别

     狗: 宠物狗、缉毒犬、导盲犬  ---> 狗类(叫、咬、吃)abstract

    当某些事物有许多共同属性的时候,我们可以使用抽象类。

    当某些事物有独特的行为、额外的功能的时候,我们可以使用接口。

    相同点:

    1)都是跟继承有联系的,位于继承的顶端,主要是给其他类实现或者继承。

    2)都不能够进行实例化。抽象类的子类来实例化,接口的实现类来实例化。

    3)都可以包含抽象方法,子类在使用的时候,都需要去重写(覆盖)这些声明出来的方法。

     不同点:

    1)抽象类为部分方法提供实现,避免子类重复去实现这些方法,可以提高代码的重用性。 接口只能是包含抽象方法的定义。

    2)一个类可以继承一个父类(抽象类),但我们可以实现多个接口,接口可以用来弥补 Java 的单继承缺点。

     3)抽象类主要是指一个事物中应该要有的内容,比如是 is..a 关系。

    4)接口主要是指一个事物中额外的内容,比如是 like..a 关系。

     如何选择使用:

    1)通过实际工作的效率上分析,要多用接口,少用抽象类。

     2)当需要定义子类的行为,还要为子类提供共有性能的时候,才选用抽象类。

    多态:

     多态的特点:

     1)最终的多态体现在父类引用变量可以指向子类对象。

     Person person = new Son();

    2)多态的前提是必须要有子父类关系或者类实现接口关系,否则不能完成多态建设。

    3)在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。

     eat(); 细嚼慢咽

     大林 --- 狼吞虎咽 √

     person.eat();

     语法格式:

            父类类型 变量名 = new 子类类型();

    1. 普通类型多态定义

    2. 抽象类多态定义

    3. 接口多态定义

     同一个父类的方法可以给多个不同的子类进行重写,在调用方法的时候,都是调用各个不同子类中重写后的方法。

    多态的成员变量

    当子类和父类中都出现同名的成员变量,多态在使用成员变量的时候有两个时期赋值:编译时、运行时。

     1)编译时:当我们的引用类型变量所对应的类中没有被调用的成员变量,则会编译失败。

     2)运行时:调用的是引用类型变量所对应的类中的成员变量的值。

    也就是说,如果在调用成员变量的时候,需要看赋值符号左边到底是哪个类?就需要用这个类中的成员变量。

    多态的成员方法

    1)编译时:当父类中定义的方法,子类中必须要重写。否则编译不通过,报错。

     2)运行时:看赋值符号右边到底实例化的是哪一个类?就用哪一个类中的成员方法。

     总结:成员变量看赋值符号左边,成员方法看赋值符号右边。

     多态的向上和向下转型:

    向上转型的话,其实是把子类对象赋值给一个直接父类的引用。这个过程是一个向上转型。

    如果我们直接 new 直接一个父类,没有办法实现向下转型。

    向上转型的使用注意点:

            动物类:Animal 子类:Dog、Cat

     向上转型的好处就是可以隐藏子类类型,提供了代码的扩展性。

     不好的地方,就是只能使用父类中共有的内容,如果想要使用子类中独有的内容时,需要额外向下转型才行。

     1)什么时候用向上转型?

     当我们不需要面对之类类型进行操作的时候,为了提供扩展性,或者使用父类功能就可以完成对应的操作就可以考虑

     使用向上转型。

    2)什么时候用向下转型?

     当要使用子类独有的功能时,必须要向下转型。

     另外,在进行转化的时候,需要留意时候会包  ClassCastException 异常。

    面向对象中三大特性的主要目的:

    封装:把对象的属性和方法的实现细节隐藏起来,可以对外提供一些公共方法进行访问。public 共有的, private 私有的

    继承:希望子类拥有父类中所有能用的功能,然后还可以在子类中进行增强。当需要注意,Java 只有单继承。

    多态:结合继承和方法的重写来提高代码的复用性和功能增强(扩展性)。

    构造器:

    构造器(构造函数、构造方法)

    每一个类都有一个隐藏的无参构造器,主要是用来初始类的实例的。

    配合 new 关键字来使用,当开始 new 的时候,构造器就会被执行,会在堆内存中开辟一个空间存储对象实例。

    如果我们直接使用无参的构造器,所得到的实例是空的,没有任何值的。

    如果一个类中,出现一个有参构造器,则会默认覆盖无参构造器。

     如果还要用到无参构造器,需要我们手动添加出来才行。

    如何理解?

    无参构造器:就相当于你老妈生你一样 —— 什么都没没有,只会哭。

    有参构造器:就相当于哪吒老妈生他一样 —— 生出来就会有风火轮、圈圈、枪。

    构造器的总结:

    1. 构造器没有返回值,也不用去添加。

    2. 主要用来构造对象,创建完对象之后,就结束了,只执行一次。

    3. 构造器的名字,必须要和类名一致。

    4. 一个类中可以存在多个构造器,主要是以重载的形式存在。

    5. 可以使用 private 进行修饰,但修饰之后其他地方不能调用了。

    相关文章

      网友评论

          本文标题:接口、多态

          本文链接:https://www.haomeiwen.com/subject/mvhlgftx.html