面向对象设计思想
1.封装
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。什么是封装?
封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
封装的作用
2.继承
优点
提高了代码的再利用性。
提高了代码的维护性。
让类与类有关,是多态的前提。
缺点
提高类的耦合性。这样一个类的变化会影响其他与此类相关的类别。
原则:低耦合,高内聚合。
耦合:类与类的关系。
内聚:自己完成某件事的能力。
打破了封装性。
执行顺序http://t.zoukankan.com/happyday56-p-4159650.html
总体逻辑,先静态初始化,然后普通初始化,然后构造函数,先父后子。特殊情况,子类的静态初始化会紧跟父类的静态初始化。
final密封
密封类可以⽤来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个⽅法,则派⽣类不能重写该⽅法的实现。
如果所有的类都可以被继承,那么很容易导致继承的滥用。进而使类的层次结构体系变得十分复杂,这样使开发人员对类的理解和使用变得十分困难。为了避免滥用继承所以提出了final。
1. 密封类就是将⼀个类密闭起来,断其后代的⼀种⽅式。就是从修饰符的类派⽣出其他的类,所以密封类不能继承。密封类可以继承其
他类,充当基类。
2. 密封⽅法是重写的⽅法(重写⽗类⽅法、重写抽象⽅法)不是为了防⽌继承⽽是防⽌重写。
3. 为了防⽌重写某些类或⽅法导致代码混乱,此时,我们可以使⽤密封类和密封⽅法。
4. 密封类除了不能被继承外,与⾮密封类的⽤法⼤致相同,⽽密封⽅法则必须通过重写基类中的虚⽅法来实现。
3.多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态存在的三个必要条件
继承
重写
父类引用指向子类对象。(实例化父类赋值给子类 示例: 父类 p = new 子类();)
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
减少冗余代码,屏蔽各个子类之间的差异,写出公用代码。
4.抽象
抽象类是一种特殊的基类。有时候,基类并不与具体的事物联系,而是只是表达一种抽象的概念,用于为它的派生类提供一个公共的界面。
抽象类的概述
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象由abstract来实现。
备注:
①抽象类不能直接实例化。
②抽象类中可以包含抽象成员,但非抽象类中不可以。
③抽象类不能被密封。
抽象和接口的区别
一、抽象类:
含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖。
二、接口:
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
抽象类和接口的使用:
1.如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
5.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
总结:抽象类是类,接口是应用类型。
一个基类可以继承多个接口,但是只能继承一个抽象类。
而且接口包含接口内的所有元素,而抽象类只包含抽象方法。