接口、多态

2018-09-10  本文已影响0人  荆棘鸟_88d0

接口(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 进行修饰,但修饰之后其他地方不能调用了。

上一篇下一篇

猜你喜欢

热点阅读