本固枝荣 —— Java面向对象特征

众所周知,Java是一门面向对象的语言,程序中我们会用类的概念来抽象的描述同一类别的事物,而对象的话,则是这同一类别事物的具体展示。举个例子,比如定义一个手机类(PhoneClass),它有颜色、尺寸、价格等属性特征和充电、计时、导航等行为特征;创建一个华为手机对象(hwPhone),它是P30、极光蓝色、售价5400RMB等具体属性和支持北斗导航模式、不支持无线充电等具体行为特征。简而言之:类给对象提供了一个模版,对象则是类的实例。

Java面向对象特征有4个:抽象、封装、继承、多态,作为基础中重要的组成部分,下面尽量用简洁而清晰的方式总结一下。

抽象

其实一开始已经说了,类本身就是抽象的概念,抽象正式定义的话,可以描述为:把一组对象共同的特征提取出来组成类的过程,特征包括属性特征和行为特征。还是举例说明:

比如:有一组不同品牌的汽车对象,属性和行为特征描述如下:

  • audiCar: 属性特征有 —— audi A6L、四轮驱动、65L油箱、360全景影像、6年10w公里保养、油耗小等;行为特征有 —— 提速快(百公里加速只需8s)、无自适应巡航等。
  • bmwCar:属性特征有 —— BMW X3、炭黑色车身、75L油箱、售价389800RMB、6年20w公里保养、油耗略高等;行为特征有 —— 提速快(百公里加速只需6s)、自适应巡航、车道自动跟车等。
  • greelyCar:属性特征有 —— 博越 2020pro、后轮驱动、60L油箱、6年15w公里保养、油耗略高等;行为特征有 —— 快(百公里加速只需6s)、自适应巡航等。

提取这些对象的共同特征: 属性特征 —— 品牌名称、油箱容量、保养期限、油耗;行为特征 —— 提速、巡航方式。

  • Car:name、oilCapacity、maintenance、fuelLiters、getSpeed()、getCruiseType() 。

这就是日常开发中组成一个类的大致过程了,可以看到:属性特征对应了Car类中的变量,行为特征对应了Car类中的方法,抽象并不会去关心这些特征细节的。

封装

开发项目过程中我们是否注意过,项目里总会有一个utils的目录,里面存放着许许多多的自定义工具类,如JsonUtils、StringUtils、ExpectionUtil等,或者代码里进行数组有关操作时使用JDK提供的Arrays类,又或者通过POM文件引入的第三方提供的工具类,如BeanUtils工具类、CollectionUtils工具类等,这些类其实都是封装概念的体现:隐藏了对象特征实现的细节,只向外界提供一系列的接口API来操作该对象。

以自定义的StringUtils类为例,开发中需要注意封装的一些细节问题:

  • 使用访问权限修饰符(public、protected、private及省略不写)修饰StringUtils类中的变量/方法时,则会影响外界对象 对StringUtils类对象的属性和行为的访问范围,如private修饰时,外界对象 无法访问和操作该类中的对象及对象的变量和方法;
  • 如果不使用static修饰tringUtils类中的变量/方法时,外界对象 访问该对象需要通过new的方式创建该对象,然后再通过该对象访问和操作相关的变量和方法;如果使用static修饰的话,则可直接通过 类名.属性 、类名.方法名 的方式访问和操作该对象的变量和方法;
  • 其他修饰符需要注意的问题:如fianl、abstract、synchronized、volatile等。

继承

Java中有对应的关键字表示类的继承关系:extends,被继承的类称为父类,或基类,或超类,继承父类的类称为子类,或孩子类,或派生类,需要注意的是类之间的继承模式是单继承的,接口之间的继承模式可以多继承继承的作用在于被继承者可以复用继承者的非私有功能,被继承者还可以实现比继承者更多的功能。

开发中需要注意继承的一些细节问题:

  • 如果非抽象子类 继承 抽象父类,一定要重写抽象父类的所有抽象方法,而抽象子类 继承 抽象父类,不一定要重写抽象父类的抽象方法;
  • 如果子类要使用父类对象的成员变量或方法,可以通过super.xxx的方式调用,而调用父类的构造器,则通过super(参数)的方式调用;
  • 如果一个接口继承多个接口,该接口不一定要重写多个接口的抽象方法;

多态

顾名思义就是有多种形态,正式一点的描述:同一个动作作用在相同或不同的对象上有不同的含义。如重载、重写都属于多态性的体现,重载是一种编译时的多态,具有静态特征;重写则是一种运行时的多态,是父类和子类之间多态性的体现,具有动态特征。

重载Overloading注意的问题:

  • 重载必须要保证同一个类中的构造方法或成员方法名称是一致的,而参数列表不同(包括参数个数,类型等);
  • 重载可以让方法的限定修饰符、声明的异常、返回值类型等不同;
  • 重载不能通过返回值的不同来区分方法重载,因为诸如A.m1(),不能明确引用A调用的m1()方法是何种返回值类型;

重写Overriding注意的问题:

  • 重写的前提要保证父类可被继承(父类非final的),重写的方法非private、非final、非static;
  • 子类重写父类的方法,要保证重写的方法参数列表(包括参数个数,类型等)等不能被修改,不能抛新的异常或范围更广的异常,返回值类型不能被修改 或修改成非派生类类型;
  • 父类的构造方法不能被重写,因为父类构造器的功能是初始化父类对象的成员变量,并通过new的方式创建该父类的实例,子类则需要在自己的构造器内完成自身成员变量的初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值