面向对象方法,OO方法所具有的模块化、信息封装与隐蔽、抽象性、继承性、多样性等独特之处,这些优异特性为研制大型软件、提高软件可靠性、可重用性、可扩充性和可维护性提供了有效的手段和途径。Java主要特征:封装性,继承性,多态性.
所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
-- Java面向对象知识总结- http://blog.csdn.net/qq_35101189/article/details/53976217
java回忆录—类与对象(万物皆对象): http://blog.csdn.net/qq_22063697/article/details/52109006
java回忆录—面向过程和面向对象的比较: http://blog.csdn.net/qq_22063697/article/details/52107881
Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。
-- c++面向对象和java面向对象的区别:
1. c++的引用是变量的一个别名,引用一旦绑定就不能重新引用其他变量,c++引用也不能为null。java引用更像c++的指针,对引用赋值是重新绑定引用的对象(在c++里面是改变对象的值),引用可以为null(导致了烦人的NPE问题,万恶之源)
java区分值类型与引用类型,用户自定义类型都是引用类型,值类型和引用类型在很多地方不能混用(如泛型参数),c++没有值类型和引用类型的概念,类似的概念是c++普通类和它的指针类型。
2.java有根基类Object,c++没有根基类。
3.类型系统:java区分值类型与引用类型,用户自定义类型都是引用类型,值类型和引用类型在很多地方不能混用(如泛型参数),c++没有值类型和引用类型的概念,类似的概念是普通类和它的指针类型。java有根基类Object,c++没有根基类。 访问控制:都有public,protected,private三级访问控制此外,java还有包访问控制,c++有友元
4. 继承:c++分public继承,protected继承(意义不明)和private继承(基本和组合没啥区别),java只有public继承。c++只能覆盖基类中显式定义的虚函数,java中方法默认是虚的,除非显式标明final c++支持多重继承,java只支持单继承,但支持实现多个接口(c++没有语法层面上的接口).
5.构造与析构:对象构造大致相同,但是c++在构造函数中调用虚函数无法多态(因为对象的子类部分还没构造)c++可以定义析构函数,java没有析构函数(java提供一个终结方法,但它和析构函数不是等价的)。
6.对象生命周期控制:c++主要靠手动申请,释放内存或者借助析构函数(RAII技术),java依靠gc
7.异常处理:c++没有也不需要finally块,释放资源依靠析构函数就行了。
8.泛型:c++模板采用代码生成技术,运行时能够保留类型信息,java采用类型擦除,类型信息在运行时就没了(所以其实只是进行安全的自动类型转换而已……)。c++模板参数可以是基本类型,用户自定义类型和整型常量,java只能是引用类型。c++还可以对模板进行特化,java没有这个功能。
9.其他:c++有运算符重载,java没有(除了String类重载了+)
10. 面向过程一种以事件为中心的编程思想,以功能(行为)为导向,按模块化的设计,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象一种以事物为中心的编程思想,以数据(属性)为导向,将具有相同一个或者多个属性的物体抽象为“类”,将他们包装起来;而有了这些数据(属性)之后,我们再考虑他们的行为(对这些属性进行什么样的操作),是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
11. C++和Java是当今两种主流的面向对象语言,C++是编译型高级语言而Java是解释型的,因此C++快速而Java兼容性好,C++适合底层控制而Java长于网络编程。
面向对象技术中的对象就是现实世界中某个具体的实体在计算机逻辑中的映射和体现,而类则是同种对象的集合与抽象。所有的Java程序都是由类或者说是类的定义组成的。在我们的学习过程中应该自始至终地牢记这一点,因为这意味着Java是一种完全的面向对象语言。Java中的所有东西都必须置入一个类。不存在全局函数、全局数据,也没有像结构、枚举或者联合这种东西,一切只有“类”!
然而C++则不同,比如C++的main方法是置于所有的类之外的,除此之外还可以在类外定义其它的函数。在C++中,全局变量、结构、枚举、联合等一些列源于C的概念仍然存在。对于在这个问题上的区别,不同的人会有不同的看法,C++的优点是灵活机动,而且比较利于C程序员接受,因为在C中成立的事情在C++中基本上不会出现差错,他们只需要了解C++多了哪些东西便可以了,然而也正因为如此,C++杂糅了面向对象和面向过程的双重概念,由此产生出的很多机制在强化某部分功能的同时破坏了程序的整体结构。
Java的垃圾回收机制是一个系统后台线程,它与用户的程序共存,能够检测用户程序中各对象的状态。当它发现一个对象已经不能继续被程序利用时,就把这个对象记录下来,这种不能再使用的对象被称为内存垃圾。当垃圾达到一定数目且系统不是很忙时,垃圾回收线程会自动完成所有垃圾对象的内存释放工作,在这个过程中,在回收每个垃圾对象的同时,系统将自动调用执行它的终结器(finalize)方法。
finalize()方法与C++中的析构函数(Destructor)有类似的地方,但是finalize()是由垃圾收集器调用的,而且只负责释放“资源”(如打开的文件、套接字、端口、URL等等)。
面向对象技术是一种以对象为基础,以事件或消息来驱动对象执行处理的程序设计技术。它具有封装性、继承性及多态性。传统的面向过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。
> 10个面向对象的设计原则:
原则1:DRY(Don't repeat yourself)
即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量; 如果你要在两个以上的地方使用一个代码块,那么可以将它设为一个独立的方法。SOLID设计原则的优点是易于维护,但要注意,不要滥用,duplicate 不是针对代码,而是针对功能。这意味着,即使用公共代码来验证OrderID和SSN,二者也不会是相同的。使用公共代码来实现两个不同的功能,其实就是近似地把这两个功能永远捆绑到了一起,如果OrderID改变了其格式,SSN验证代码也会中断。因此要慎用这种组合,不要随意捆绑类似但不相关的功能。
原则2:封装变化
在软件领域中唯一不变的就是“Change”,因此封装你认为或猜测未来将发生变化的代码。OOPS设计模式的优点在于易于测试和维护封装的代码。如果你使用Java编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从private到protected和not public。有几种Java设计模式也使用封装,比如Factory设计模式是封装“对象创建”,其灵活性使得之后引进新代码不会对现有的代码造成影响。
原则3:开闭原则
即对扩展开放,对修改关闭。这是另一种非常棒的设计原则,可以防止其他人更改已经测试好的代码。理论上,可以在不修改原有的模块的基础上,扩展功能。这也是开闭原则的宗旨。
原则4:单一职责原则
类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。
原则5:依赖注入或倒置原则
这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。
原则6:优先利用组合而非继承
如果可能的话,优先利用组合而不是继承。一些人可能会质疑,但我发现,组合比继承灵活得多。组合允许在运行期间通过设置类的属性来改变类的行为,也可以通过使用接口来组合一个类,它提供了更高的灵活性,并可以随时实现。《Effective Java》也推荐此原则。
原则7:里氏代换原则(LSP)
根据该原则,子类必须能够替换掉它们的基类,也就是说使用基类的方法或函数能够顺利地引用子类对象。LSP原则与单一职责原则和接口分离原则密切相关,如果一个类比子类具备更多功能,很有可能某些功能会失效,这就违反了LSP原则。为了遵循该设计原则,派生类或子类必须增强功能。
原则8:接口分离原则
采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。设计接口很棘手,因为一旦释放接口,你就无法在不中断执行的情况下改变它。在Java中,该原则的另一个优势在于,在任何类使用接口之前,接口不利于实现所有的方法,所以单一的功能意味着更少的实现方法。
原则9:针对接口编程,而不是针对实现编程
该原则可以使代码更加灵活,以便可以在任何接口实现中使用。因此,在Java中最好使用变量接口类型、方法返回类型、方法参数类型等。《Effective Java》 和《head first design pattern》书中也有提到。
原则10:委托原则
该原则最典型的例子是Java中的equals() 和 hashCode() 方法。为了平等地比较两个对象,我们用类本身而不是客户端类来做比较。这个设计原则的好处是没有重复的代码,而且很容易对其进行修改。
总之,希望这些面向对象的设计原则能帮助你写出更灵活更好的代码。
C是面向过程;C++、 JAVA是面向对象
> 面向对象和面向过程的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程 基于算法 函数/过程 数据流图、伪代码... ...;
面向对象 基于对象 类 UML建模... Rose,viso等;
其实我始终认为,不管是面向对象,还是面向过程,都体现了一种软件重用的思想! 只不过面向过程中重用的是过程和函数,但是面向对象重用的是类,一种将数据和处理数据的过程及函数封装在一起的实体,其实面向对象中的过程和函数和面向过程中的分别不是很大,所以数据流图和伪代码还是有用的。面向对象一个很大的好处就是数据 和方法的封装,由此面向对象的三大特性得到发挥面向过程是在面向对象出现之前,以及之后,甚至至今都应用于程序开发中的程序设计思想。
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
-- 面向对象和面向过程
1.面向过程程序设计方法的实质上是从计算机处理问题的观点来进行程序设计工作:输入——运算——输出。面向过程程序设计者需要变更习惯的思维方法以贴近计算机的内部工作机理。面向过程程序设计所具有的流的工作性质,试图通过信息流及其转换来认识系统,不仅加大了程序设计的难度,同时亦使得程序的可理解性比较差。
面向对象程序设计方法中,一种普遍采用的优化方法是使用结构化的程序设计方法。
面向过程程序设计方法一般适宜采用自上而下的设计方法。
面向过程程序设计方法需要在一开始就全面的,自上而下的设计整个应用程序的架构,因此要求程序设计者对问题域有全面的了解。
面向过程程序设计方法很难复用以前已经设计完成的软件。
2.面向对象程序设计是一种自下而上的程序设计方法,往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计一数据为中心,类作为表现数据的工具,成为划分程序的基本单位。
-- 面向对象有以下几个重要特点:
(1)客观世界有对象组成
(2)对象抽象为类
(3)类与类之间存在继承关系
(4)对象之间通过传递消息而彼此联系
-- 面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
-- 面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
-- 面向对象程序设计的一些显著的特性包括:
.程序设计的重点在于数据而不是过程;
.程序被划分为所谓的对象;
.数据结构为表现对象的特性而设计;
.函数作为对某个对象数据的操作,与数据结构紧密的结合在一起;
.数据被隐藏起来,不能为外部函数访问;
.对象之间可以通过函数沟通;
.新的数据和函数可以在需要的时候轻而易举的添加进来;
.在程序设计过程中遵循由下至上(bottom-up)的设计方法。
OOP具有许多优点,无论是对于程序设计者或者用户来说都是如此。面向对象为软件产品扩展和质量保证中的许多问题提供了解决办法。这项技术能够大大提高程序员的生产力,并可
-- 提高软件的质量以及降低其维护费用。其主要的优点陈列于下:
1、通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途;
2、我们可以在标准的模块上(这里所谓的"标准"指程序员之间彼此达成的协议)构建
我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产效率;
3、数据隐藏的概念帮助程序员们保护程序免受外部代码的侵袭;
4、允许一个对象的多个实例同时存在,而且彼此之间不会相互干扰;
5、允许将问题空间中的对象直接映射到程序中;
6、基于对象的工程可以很容易的分割为独立的部分;
7、以数据为中心的设计方法允许我们抓住可实现模型的更多细节;
8、面向对象的系统很容易从小到大逐步升级;
9、对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单;
10、更便于控制软件复杂度。
当需要将以上所说的所有特性有机的结合于一个面向对象系统中,它们之间的相对重要
性就取决于工程的类型和程序员的喜好。为了获得上述的某些优势,必须考虑很多事情。例
如,对象库必须可以被重用。技术还在不停的发展,现有的产品也会很快的更新换代。如果
重用没有能够实现,那么就需要进行严格的控制和管理。易于使用的开发软件往往难以编写。面向对象程序设计工具有望解决这个问题。
-- 总结面向对象的概念和术语汇总表, 术语 描述
Abstract Class抽象类 不能实例化的类
Abstraction抽象 一个项目(可能是类或者操作)的本质特征
Aggregation聚合 两个类或者组件之间的关系,定义为“is part of”
Association关联 两个类或者对象之间的关系
Attribute属性 类了解的东西(数据/信息)
Cardinality基数 表示“有多少”的概念
Class类 类似对象的一种软件抽象,创建对象的模板
Cohesion内聚 封装单元(如组件或者类)的相关程度
Component组件 一种内聚功能单元,可以独立开发、发布、由其他组件编辑组成更大的单元。
Composition组合 强类型的聚合,其中“整体”完全负责各个组成部分,每个部分对象仅与一个“整体”对象相关联
Concrete Class具体类 可以从中实例化对象的类
Coupling耦合 两个项目之间的依赖程度
Generalization泛化 表示一个更泛化的元素和一个更具体的元素之间的关系。
Inheritance继承 定义为“is a”或者“is like”的关系
Instance实例 一个对象,它是某个类的一个示例
Instantiate实例化 从类定义中创建对象
Interface接口 定义了一套内聚行为的一个或多个操作特性标记的集合
Message消息 请求星系或者执行任务
Messaging消息传递 对象之间通过发送消息相互协作的过程
Method方法 有执行值操作的类实现的一个过程(与结构化编程中的函数相似)
Multiple Inheritance多重继承 直接继承自一个以上的类
Object对象 基于类定义的人物、地点、事件、事物等等
Optionality选择性 概念“你需要它吗?”
Override 在子类中重新定义属性和/或方法,以使它们与父类中的定义有区别
Pattern 在考虑相关因素的情况下,通用问题的一个可行性解决方案
Polymorphism多态 不同的对象可以以不同的方式响应同一消息,使对象可以交互而不需要知道确切的类型
Property 在UML2中,是一个命名的值,例如,属性和关联,包括组合,指定元素(例如类或者组件)的一个特征。在Java中,属性的组合包括Getter和Setter
Single Inheritance多重继承 仅从一个类直接继承
Stereotype构造型 建模元素的一种通用用法
Subclass子类 继承自另一个类的类
Superclass父类 另一个类从中继承的类
-- SOLID原则是类级别的,面向对象的设计理念:
(S)RP 单一职责原则 一个类有且只有一个更改的原因。
(O)CP 开闭原则 能够不更改类而扩展类的行为。
(L)SP 里氏替换原则 派生类可以替换基类被使用。
(I)SP 接口隔离原则 使用客户端特定的细粒度接口。
(D)IP 依赖反转原则 依赖抽象而不是具体实现。
-- 面向对象并不是因为有了对象就高大上了,实则是因为它实实在在的解决了软件开发中的许多问题。你想想,仅仅是对struct 加了个访问控制而已,就演化出封装、继承、多态,而这些特性是面向过程语言不易构造出的,更关键的,它使代码复用变得容易许多(还是觉得函数才是复用的单元).
-- PO:
persistant object持久对象
最形象的理解就是一个PO就是数据库中的一条记录。
好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
-- BO:
business object业务对象
主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。
-- VO :
value object值对象
ViewObject表现层对象
主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。
-- DTO :
Data Transfer Object数据传输对象
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO
-- POJO :
plain ordinary java object 简单java对象
个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。
一个POJO持久化以后就是PO
直接用它传递、传递过程中就是DTO
直接用来对应表示层就是VO
-- DAO:
data access object数据访问对象
这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要.
主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO