我们经常说Java是一门面向对象语言,那么什么是对象?

我jio得吧,对象就是现实中各种事物在计算机语言中的映射,相比以往的面向过程语言来说,面向对象它关注的是事物,然后基于这些事物的问题去产生一个新类型的对象。也就是说面向对象它关注的是问题本身,而不是问题的具体解决步骤。它就是将一个事务抽象成计算机中的一种特殊的变量,具有自己的属性,而这些属性就分为动态和静态,动态的就是方法。例如:跑、跳。而静态的就是变量,比如身高、年龄等。

 

那么OOP(面向对象)与OPO(面向过程)有什么区别呢?就比如说下五子棋:如果是OPO,那么它可能就是 开始游戏、黑子先走、白子再走、判断输赢、结束游戏。而如果是OOP的话,它可能就是有棋手对象、棋盘对象、规则对象。黑棋接到输入后告知棋盘进行绘制,然后白棋接到输入之后再告知棋盘进行绘制最后再通过规则去判断输赢。所以 ,我们可以总结的说,OPO里关注的是解决问题的步骤,而OOP关注的是问题本身。遇到一个新的问题,我们可以去创建新的类型的对象。

那么类型是什么?类型就是所抽象的是什么,它描述了具有相同特性和行为的对象集合。所以 类也就是一种数据类型。

 

一个类的创建者我们称为creator,一个类的使用者我们称为user。当creator创建一个类的时候往往只会开放部分接口来供user去使用,这样可以达到解耦的目的,使用者不会去关注接口之外的东西,只要自己调用就好,而创造者则不会因为要修改被隐藏的部分而影响到别人。这就是我们常说的封装。

 

当类被创建且被测试完成之后,往往希望这个类可以被复用。那么如何去复用呢?最简单的方式就是,我可以在另一个类里面去创建这个类的对象,这样我们就可以通过其他类的对象来实现新的类的功能组成这种方式也被称之为组合,这是一种 “has-a"的关系,就比如说 汽车拥有引擎。

 

当我们创建一个类的时候,发现另一个类有很多类似的功能,那么可能会选择"ctrl c + chtl v"去复制粘贴,但是如果有100个这样的类呢?所以基于这个问题,OOP有一种解决方式叫做继承。可以通过将共同特点抽象出来,放在一个类中,这个类就被称为就基类。当有需要直接去继承基类,那么这个继承的类就叫做基类的派生类。就比如说垃圾是一种基类,那么不可回收垃圾、有色垃圾等具有自己的特性的就是派生类。

 

继承有两种方式,第一种是覆盖(is - a),第二种是扩展。覆盖就是将基类的方法继承之后然后用自己的的逻辑去实现,而扩展(is - like - a)就是在继承了基类方法的原有基础上还加了自己的方法。

 

我们往往希望把一个对象不当成它的特有类型对待,而希望是共有的,这样我们就可以进行复用。所以就有了多态的产生。编译器往往在运行期才会知道这个对象到底是什么类型的,所以对Java这种纯面向对象的语言而言,多态仅仅是重写,重载不算多态。