Java的基础特征,抽象、封装、继承、多态

前言概述

        在《java编程思想》中提到在java的世界中一切皆是对象的概念,对象就是对现实世界事物的抽象结果,它集成了事物的属性和行为,抽象程度越高越具有普适性,例如:生物---->动物(植物)---->哺乳动物(被子植物门)---->人(蔷薇目)---->男人(豆类)。这里的“生物”就是最高的一个抽象,世间的生命都可称为生物,它都有是否活着的属性和新陈代谢的行为。抽象程度越低越具有独立的"个性",即除了高层的属性和行为之外还有自己特有的属性和行为。所以,java是面向对象编程的语言,从某种程度上说也可以说是面向抽象编程的。除了抽象这一大特征外,还有其它的三大特征,分别是:封装、继承和多态。下面我们来一一了解。

本章内容

  • 抽象、封装、继承、多态的概念
  • 如何理解抽象接口和抽象类
  • 重写与重载

抽象、封装、继承、多态的概念

抽象:

        对事物的虚拟化总结的过程,理清事物的属性和行为,屏蔽它的细节并应用到java编程当中。例如,上例中的生物,它具有新陈代谢的行为,但如何新陈代谢每种具体的生物都不相同。所以抽象只描述它的行为,具体怎么做那要看具体的实体(实现类)。

优点:

  • 统一定义某一类事物的行为规范
  • 为现实事物和java世界提供一个灵活的编程通道

封装:

        顾名思义,就是利用java中的数据类型把属性和行为的具体实现私有化,只暴露出特定的方法与外界交互,这样就很好的隐藏了实现细节,使用者无需知道经过了哪些步骤完成某个行为,它只需要知道自己需要哪个行为即可。所以,适当的封装可以让代码更容易维护,也加强了代码实现的安全性。

优点:

  • 行为内部的实现可以自由的修改,只要能达到使用者的目的即可。
  • 良好的封装可以减少代码的耦合程度。
  • 可以隐藏某些信息,对成员属性有更精确的控制。
  • 分工明确,由专业的人去做专业的事。

继承:

扫描二维码关注公众号,回复: 4492887 查看本文章

         从现有的类派生出新的类,派生出来的类具有和父类相同的非私有属性和行为。除了父类的行为,子类也可以实现自己的行为。在java中为程序管理的方便,只允许单继承,但可以多重继承多类继承,即类最多只能有一个父类。父类是子类的一般形式,而子类是父类的特例(具体父类的行为和自己特有的行为)。

优点:

  • 减少冗余代码,增加程序的复用性
  • 可以统一定义子类的行为,增加类行为的一致性,易于维护。

多态:

         多种形态,即同一个行为具有多个不同的表现形式,具体以哪一种形式执行,必须要在运行时才能确定。多态存在的实现方式:

  1. 继承,多态中必须要有父子关系的存在,这样一个引用可以指定给不同的子类。
  2. 重写,在调用这些方法的时候就是执行子类重写的方法而不是父类的方法。
  3. 父类引用指向子类对象。

其优点:

  • 消除类型之间的耦合
  • 灵活性,运行时根据需要传入不同的子类型
  • 简化性,由于使用的是父类的行为定义,而具体的实现则不需要去关注

小结:

        java编程的过程就是对事物进行合理的抽象,通过继承、封装和多态的特性实现对象和对象按某种业务关系相互协同工作而达到某种业务目的的过程。再在这个过程中考虑解耦、扩展性、易用性、易维护、如何实现高效率等等问题。

如何理解抽象接口和抽象类

         广义上来说,抽象类和接口都是为了子类继承而存在的,目的是为了规范子类的某些行为。但在java中只允许单继承类,却可以实现多个接口。抽象类不能被实例化,此类中的所有方法必须是public或protected的,默认是public,对非抽象方法可以提供默认的实现,继承此抽象类的子类必须实现它的抽象方法,若不实现那么子类也必须标识为抽象的。接口是对一类事物的行为的更高层次的抽象,对所有修改关闭,对扩展开放。即它当中的成员变量都是static final的不可以被修改,所有的方法也都是默认abstract的。所以继承此接口的子类必须实现它所有的方法(在java8以后接口提供了默认实现的功能可以不在子类中实现)。

总之,主要区别:

  • 抽象类可以有自己的成员变量和非抽象实现的方法,而接口的成员变量都是常量方法也都是抽象方法。
  • 抽象类更多的是对事物的抽象(可以有属性和行为),像是一个模板,子类具体此模板的内容,接口则注重行为的抽象,是子类的行为规范准则并不提供具体内容。

重写与重载

重载(静态多态性):

  • 是发生在同一个类中的多态特性,具有相同的方法名但有不同的参数类型或参数个数,返回类型 不限制但无法只以返回类型作为重载的区分标准。
  • 重载是让类以统一的方式处理不同类型数据的一种手段,同一个方法名仅仅要往里面传递不同的参数就能够拥有不同的功能或返回值,能够使用使得类结构更加的清晰简洁。
  • 最常用的就是构造器的重载,可以根据不同的业务选择对应的构造器。

重写(动态多态性):

  • 是发生在继承关系中的多态特性,子类中可以继承父类的方法,但如果子类想要在方法的实现上做一些改变就需要重写此方法。
  • 子类的方法名、参数、返回类型必须要与父类相同,同样的方法不同的实现。如需调用父类的方法可以使用super。
  • 重写的主要用处就是可以重新定义子类特有的操作。
  • 父类中的方法如果没有修饰符(默认修饰(default))时,只能在同一包中被子类重写,如果其它包中的类想重写,方法必须是public和protected。而且,子类中重写的方法修饰符必须要大于等于父类的修饰符。
  • 子类重写的方法抛出的异常类型必须小于等于父类抛出的异常范围。例如:父类的异常是IOException,子类就不能是Exception。

附,网络上copy的一张异常类关系图:

猜你喜欢

转载自blog.csdn.net/xpsallwell/article/details/83995692
今日推荐