封装、继承、多态--java

时间:2022-04-03 00:04:05

 

0.绪论  

  面向对象的三大特性是封装、继承和多态。本文将以java为例简单阐述一下这三个概念。

  首先说明一下,在java中,对象是指一个java类的一个实例。java类中的成员包括数据成员和方法成员,其中数据成员又被称为属性,方法成员简称为方法。

 

1.封装

  1.1 概念:封装是指把对象(即java类)的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口(接口是指外部可访问的数据成员和方法成员)。

  1.2 优点/产生原因

  (1)安全性:类使用者只能通过暴露的接口去使用该类的实例,避免了类使用者对该类对象的不当操作(eg.使用者不小心修改了对象的某个私有数据成员,导致在调用该对象某个方法时结果与预想结果不一致);

  (2)灵活性:在保证暴露的接口不变的情况下,类创建者可以任意修改被隐藏的部分,而不用担心对类使用者造成影响。

  1.3 在java中如何实现封装

  封装的实质是访问控制,其目的是控制类使用者对类中成员(包括数据成员和方法成员)的访问权限。在java中,java开发者使用publicprivateprotected三个关键字来声明访问控制。其中,public关键字表示紧随其后的元素对任何人都可用;private关键字表示除类型创建者和类型的内部方法之外的任何人都不能访问;protected关键字表示除类型创建者、类型的内部方法和继承类(即子类)外的任何人都不能访问。

  在没有使用这三个关键字的情形下,java默认的访问权限是包访问权限,即某个类的成员可以被与该类处在同一个包中的其他类访问。(包,就是文件目录或者文件夹的意思。)

  总结:java开发者通过publicprivateprotected三个关键字来声明访问控制,如果没有就采用java提供的默认访问权限(即包访问权限),然后java编译器或者虚拟机负责解析publicprivateprotected关键字并实现访问控制功能,从而实现封装。

  注意点:public、private和protected是java中的访问限制词,不仅可以用于修饰数据成员、方法成员,可以用于修饰class、interface等。

 

2.继承

  2.1 概念:继承是指在已有类的基础通过修改或者添加其数据成员、方法成员形成一个新的类。

  继承的层次如图2.1所示,箭头表示导出类继承了基类。已有类被称为基类或者父类,形成的新类称为导出类,也称子类

 

封装、继承、多态--java

图2.1 继承层次UML图

  2.2 子类和基类可能的组合形式:

  (1)子类和基类完全一致;(这种形式比较少见,与基类完全一致的子类毫无意义。)

  (2)子类和基类对外提供的接口完全相同,但子类重写(overriding,又称覆盖)了基类的某些方法;(关于重写请阅读方法重载和重写--java

  (3)子类在基类对外提供的接口之上新添加了接口(可能是重载了基类方法,也可能是新添加了方法和数据成员);(关于重载请阅读方法重载和重写--java

  (4)子类既新添加了接口,又重写了基类的某些方法((2)和(3)的综合);

   总结:子类可以通过方法重写或新添加接口两种方式来使得自身与基类不同。

  2.3 优点/产生原因:代码复用(可以通过复用基类代码创建一个与基类类似的类)

  2.4 在java中如何实现继承:java开发者通过extends关键字声明继承关系,然后java编译器或者虚拟机负责解析extends关键字并实现继承功能。

  2.5 注意点:

  (1)通过继承,子类对象既可以看作是子类类型,也可以看作是基类类型。但是,基类对象则只能是基类类型(除非子类与基类完全一样);

  (2)java语言采用单根继承机构,即java中所有的类最终都继承自单一的基类(Object类);

  (3)一个类只能通过extends关键字声明一个基类。当没有显示声明时,该类的直接基类是Object类,即一个类只有一个直接基类;

  (4)java中继承关系是可以传递的,即:如果A是B的子类且B是C的子类,那么A也是C的子类。

 

3.多态 

  3.1 产生原因:多态与继承密不可分,本文2.2中提到在继承中子类与基类产生差异的方法包括重写基类方法和新添加接口两种方式,新添加接口的方式很自然地扩展了基类。但是,当子类重写了基类方法后,带来了这样一个问题:由于继承之后子类对象也可以看作是基类类型,对于一个声明为基类类型的子类对象,在调用该对象的重写方法时我们往往期望运行重写后的方法,而不是基类中的方法。但是在java编译器看来,该对象是基类类型,因此执行基类中的方法是毋庸置疑的。那么,如何使得在调用该对象的重写方法时达到我们期望的效果呢?多态可以帮助我们达到这个效果,这也就是多态产生的原因和意义。

  3.2 概念:多态,又称为后期绑定,是指当向对象发送消息时,被调用的代码直到运行时才确定。通俗一点说,多态就是指当一个方法的返回值类型、方法名和参数(参数个数、参数类型和参数顺序)相同时,针对不同的对象调用该方法时执行对应类中的实现版本。

  3.3 在java中如何实现多态:由java虚拟机提供支持,不需要开发者考虑

 

4.总结

  封装需要java开发者通过public、protected、private关键字实现(如果没有这些关键字,就由java默认的包访问权限实现),继承需要java开发者通过extends实现,而多态无需开发者做任何操作,是java虚拟机提供的机制,用于支持继承中的方法重写能正确运行。

  特别注意:多态是依赖于继承存在的,如果不需要继承,就不需要多态。更具体地讲,如果不需要继承中的方法重写,就不需要多态。