admin管理员组文章数量:1566364
众所周知,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的方式创建该父类的实例,子类则需要在自己的构造器内完成自身成员变量的初始化。
版权声明:本文标题:本固枝荣 —— Java面向对象特征 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1725576693a1030549.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论