[关闭]
@TryLoveCatch 2022-04-17T09:56:00.000000Z 字数 6335 阅读 329

Java知识体系之面向对象

Java知识体系


怎么理解面向对象?

世界上有很多事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间也有各种关系。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
“属性” 包括对象的静态信息,如特性、状态等;“行为” 也就是动态信息,如对象的操作、功能等。
把具有相同属性和行为的对象归纳为类,类是一个抽象的概念,对象是类的具体。

面向对象的编程方法有四个基本特性:

类之间的关系:

总的来说,这几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖

面向对象的优点

面向对象的优点:可扩展性、可维护性和可重用性。

面向对象 & 面向过程

面向过程是一种以过程为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用,是一种基础的顺序的思维方式。
面向过程开发方式是对计算机底层结构的一层抽象,它将程序分为数据和操纵数据的操作两部分,其核心问题是数据结构和算法的开发和优化。

面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的编程思想,通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
面向对象方法直接把所有事物都当作独立的对象,处理问题过程中所思考的不再主要是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。

面向对象和面向过程的思想有着本质上的区别,当面对一个问题时:

关于这个本质区别,我们举例说明一下,设计一个五子棋程序:

可见,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。
如要加入悔棋功能,若是面向过程设计,则从输入到判断到显示的若干步骤都要改动,甚至步骤之间的先后顺序都可能需要调整。而若是面向对象设计,则只需改动第 ② 类对象(棋盘对象)即可,棋盘对象保存了黑白双方的棋谱和落子先后顺序,简单回溯操作即可实现悔棋功能,并不涉及显示和规则部分,改动是局部可控的。

所以,我们总结一下,两者的优缺点:

- 面向对象 面向过程
特性 抽象、继承、封装、多态 功能模块化,代码流程化
优点 易维护、易复用、易扩展、低耦合 性能高,适合资源紧张、实时性强的场合
缺点 性能比面向过程低 没有面向对象易维护、易复用、易扩展

可以这样理解:

抽象&封装&继承&多态

抽象

将同一类事物的共同特征总结出来,构造成类的过程。包括数据抽象以及行为抽象。数据抽象变成类的属性,行为抽象变成类的方法。抽象只关心变量以及方法,并不关系具体的实现细节。
抽象更多的是一种思维,我们在编程的时候也要带入这种思维,比如getTaobaoOrder() 这个方法随着项目的拓展可能就不太适用了,用getOrder()会更好。

封装

把对象的数据和行为结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
可以理解为我们无论内部实现有多复杂,使用者可以完全不用理,只需要知道怎么使用就可以了。

封装的好处是:

继承

一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。

继承的好处:

多态

通俗的讲,就是同一个东西表现出多种状态。比如男孩,女孩都是人类,都是人类的不同状态。

多态指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

多态是和继承一脉相承的,多态存在的需要有三个必要条件:继承、重写、父类引用指向子类对象。
用个案例再补充解释一下:
比如说打印机,它属于一个父类,有一台彩色打印机,属于子类,有一台黑白打印机,也属于子类。

多态的好处:

Java为什么不支持多继承?

为什么接口可以多继承呢?

接口全都是抽象方法,并没有具体实现,继承谁都无所谓,不存在菱形继承的问题,所以接口可以继承多个接口。

类的关系?

类之间的关系:

总的来说,这几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖

重载&重写

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。

区别点 重载 重写
参数列表 必须修改 一定不能修改
返回类型 可以修改 可以是当前返回类型/子类
异常 可以修改 可以减少/删除,一定不能抛出更广/新的异常
访问 可以修改 可以降低限制,例如(protected->public)

访问修饰符

修饰符 当前类 当前包 子类 任何地方
private
default
protected
public

抽象类&接口

接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API定义和实现分离的目的。
接口,不能实例化;不能包含任何非常量成员,任何field都是隐含着public static final的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java标准类库中,定义了非常多的接口,比如java.util.List。

抽象类是不能实例化的类,用abstract关键字修饰class,其目的主要是代码重用。
除了不能实例化,形式上和一般的Java类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取相关Java类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。Java标准库中,比如collection框架,很多通用部分就被抽取成为抽象类,例如java.util.AbstractList。

设计层面

语法

相同点

不同点

-- 抽象类 接口
方法默认实现 支持 自1.8支持
实现 extends继承抽象类,实现抽象方法 implements实现接口的所有方法
是否有构造函数
方法的访问修饰符 public、protected和default public
main方法 支持 不支持
添加方法 非抽象方法,子类不需要更改 自1.8可以有默认实现
成员变量 都可以 只能是常量

面向对象的原则

SOILD

面向对象,设计一个计算器

参考

https://blog.csdn.net/zzy0919sun/article/details/81171006
http://c.biancheng.net/view/7811.html
https://baijiahao.baidu.com/s?id=1677502245765548859&wfr=spider&for=pc
https://blog.csdn.net/notthin/article/details/121395289
https://blog.51cto.com/u_13604316/2729479
https://blog.csdn.net/qfguan/article/details/121226260
https://www.cnblogs.com/shudayoukuzhi/p/15703940.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注