面向对象

面向过程让计算机有步骤地顺序作一件事,是过程化思惟,使用面向过程语言开发大型项目,软件复用和维护存在很大问题,模块之间耦合严重。面向对象相对面向过程更适合解决规模较大的问题,能够拆解问题复杂度,对现实事物进行抽象并映射为开发对象,更接近人的思惟。spa

例如开门这个动做,面向过程是 open(Door door),动宾结构,door 做为操做对象的参数传入方法,方法内定义开门的具体步骤。面向对象的方式首先会定义一个类 Door,抽象出门的属性(如尺寸、颜色)和行为(如 open 和 close),主谓结构。日志

面向过程代码松散,强调流程化解决问题。面向对象代码强调高内聚、低耦合,先抽象模型定义共性行为,再解决实际问题。对象

对于描述复杂的事物,为了从宏观.上把握、从总体上合理分析,咱们须要使用面向对象的思路来分析整个系统。可是,具体到微观操做,仍然须要面向过程的思路去处理。

三大特性

封装是对象功能内聚的表现形式,在抽象基础上决定信息是否公开及公开等级,核心问题是以什么方式暴漏哪些信息。主要任务是对属性、数据、敏感行为实现隐藏,对属性的访问和修改必须经过公共接口实现。封装使对象关系变得简单,下降了代码耦合度,方便维护。一般,应禁止直接访问一个对象中数据的实际表示,而应经过操做接口来访问,这称为信息隐藏继承

就是对封装的要求,即 A 模块使用 B 模块的某接口行为,对 B 模块中除此行为外的其余信息知道得应尽量少。不直接对 public 属性进行读取和修改而使用 getter/setter 方法是由于假设想在修改属性时进行权限控制、日志记录等操做,在直接访问属性的状况下没法实现。若是将 public 的属性和行为修改成 private 通常依赖模块都会报错,所以不知道使用哪一种权限时应优先使用 private。接口

继承用来扩展一个类,子类可继承父类的部分属性和行为使模块具备复用性。继承是"is-a"关系,可以使用判断是否知足"is-a"关系,即任何父类出现的地方子类均可以出现。若是父类引用直接使用子类引用来代替且能够正确编译并执行,输出结果符合子类场景预期,那么说明两个类符合里氏替换原则。ci

多态以封装和继承为基础,根据运行时对象实际类型使同一行为具备不一样表现形式。多态指在编译层面没法肯定最终调用的方法体,在运行期由 JVM 动态绑定,调用合适的重写方法。因为重载属于静态绑定,本质上重载结果是彻底不一样的方法,所以多态通常专指重写。开发

多态注意事项:
一、多态是方法的多态,属性没有多态
二、父类和子类,有联系 类型转换异常!ClassCastException!
三、存在条件:继承关系,方法须要重写,父类引用指向子类对象!Father f1 = new Son();

重载和重写的区别

重载指方法名称相同,但参数类型个数不一样,是行为水平方向不一样实现。对编译器来讲,方法名称和参数列表组成了一个惟一键,称为方法签名,JVM 经过方法签名决定调用哪一种重载方法。无论继承关系如何复杂,重载在编译时能够根据规则知道调用哪一种目标方法,所以属于静态绑定get

JVM 在重载方法中选择合适方法的顺序:
① 精确匹配。
② 基本数据类型自动转换成更大表示范围。
③ 自动拆箱与装箱。
④ 子类向上转型。
⑤ 可变参数。

重写指子类实现接口或继承父类时,保持方法签名彻底相同,实现不一样方法体,是行为垂直方向不一样实现。编译器

元空间有一个方法表保存方法信息,若是子类重写了父类的方法,则方法表中的方法引用会指向子类实现。父类引用执行子类方法时没法调用子类存在而父类不存在的方法。权限控制

 
重写时须要注意的:
一、方法名必须相同;
二、参数列表必须相同;
三、返回值类型:小于等于父类的方法返回值类型;
四、抛出的异常:范围,能够被缩小相同,但不能扩大;
五、修饰符:范围能够扩大相同但不能缩小;
这就是所说的重写方法的两同两小一大原则
重写的缘由:父类的功能,子类不必定须要,或者不必定知足!

类之间的关系

 
类关系 描述  权力强侧 举例
继承 父子类之间的关系:is-a 父类 小狗继承于动物
实现 接口和实现类之间的关系:can-do 接口 小狗实现了狗叫接口
组合 比聚合更强的关系:contains-a 总体 头是身体的一部分
聚合 暂时组装的关系:has-a 组装方 小狗和绳子是暂时的聚合关系
依赖 一个类用到另外一个:depends-a 被依赖方 人养小狗,人依赖于小狗
关联 平等的使用关系:links-a 平等  人使用卡消费,卡能够提取人的信息
相关文章
相关标签/搜索