面向对象其实是种思想,凡是思想都是比较抽象的,所以我们总要找到一些方法使它便于我们理解;建模就是最常用的方式,而建模的一个特点就是减少关注度,尽量减少对具体细节的关注,这在面向对象三大特性中深有体现。
其实面向对象的三大特性并不是面向对象所必需的,只是在面向对象建模时为了解决一些共性的问题而总结出来的;具体三大特性的由来和要解决的问题看“三大特性解释”。而五大原则则是在实现这三大特性时或者说再具体操作这三大特性时,为了让我们少走弯路,经过长时间积累和验证,总结出来一些行之有效的思维方式。而设计模式则是具体经典场景的解决方案。

面向对象的三大特性:

封装

  封装就是把客观事物封装成抽象的类,并且此类可以把自己的属性和方法只对信任的类开放,对不信任的类封闭。
换句话说,我们之所以封装就是为了减少我们对一个对象的所包含内容的关注度,对外界来说我只关心这个对象,能做什么事情,具体这个对象如何具有这些特性,或者如何做事情的我不关心,为了达到这个目的,我们就有必要对这个对象进行封装,把那些对于外界来说不需要关心的东西封装起来,不对外暴露。

继承

  继承是让某个类型的类 获得另一个类型的类型的属性或方法。它是指这样一种能力,它可以使用现有类的所有功能,并且在不编写原有类的情况下对这些功能进行扩展。
换句话说,在我们考虑一类东西的不同对象时,会发现这些对象具有某些共同的特性,这样我们就可以把这些特性抽出一个父类,二子类只需要继承这个父类就行了,这样这些共有的特性就有一个对象来管理,同时其子类又具备这些特性,这样就避免了同一个东西有不同对象控制所带来的问题。

多态

  是指一个实例的同个方法在不同的形态下有不同的表现形式。比如,一个类中具有多个方法名相同的方法,但是每个方法的所包含的参数是不一样的,这包括,参数个数不一样,或者参数的类型不一样,或者两者都不一样。
换句话说,一个对象在不同条件下做同一个事情的不同表现形态。

面向对象的五大原则:

单一职责原则

一个类应该只有一个引起它变化的原因,也就是说一个类的职责要单一不能保罗万象。(最近简单,最容易理解,确实最难做到的设计)

开放封闭原则

既是开放的又是封闭的,对扩展是开放的,对更改是封闭的,

例如,在对一个软件需要做出修改时,如果能够做到,不修改原有的源代码,就可以完成功能的扩展,那这个软件设计就是符合开闭原则的。 
这个原则在我设计类时很有帮助,坚持这个原则就必须酒量考虑接口的封装,抽象机制和多态技术。

替换原则

依赖倒置原则

    高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。所谓抽象就是抽类或者接口,不能直接实例化的。细节就是具体的实现类,实现接口或者继承抽象类所产生的类,可以通过关键字new直接实例化的。
依赖倒置的本质是契约式编程,通过抽象是个各类和模块的实现相互独立,不相互影响,是各模块间实现松耦合。
例如,类A直接依赖类B,假如需要类A改为依赖类C,则必须通过代码来时达成。在这种情况下,类A所欲高层,负责具体的复杂业务实现,类B和类C属于底层,负责基本的原子操作,如果直接修改类A的话就会给程序员带来额外的风险。
解决方案,就是类A依赖一个接口I,而类B和类C实现这个接口I,类A和类B,类C间接地建立联系,这样就会大大的见地类A修改的风险。
依赖倒置给予这样一个事实,相对于细节的东西,抽象的东西要稳定的多,基于抽象的系统要比基于细节的系统稳定的多,可维护性更强。

接口隔离原则

    这个原则的意思就是:使用多个专门的的接口比使用单个接口要好的多
例如,在实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现的时候花了太多的精力,而接口所定义的操作相当于对客户端的承诺,这种承诺当然是越少越好,越精炼越好,过多的承诺带来的就是你的大量精力和时间去维护!

oo编程开发的范式:

划分对象----->抽象成类----->将类组织成为层次化结构----->用类和实例进行设计和实现

面向对象编程设计的几个阶段:

第一个阶段

面向名词(POJO):就是为了数据的存储,主要是通过设计出来的数据库具体信息区理解和分析系统

POJO注重的是类的属性,但有些面向对象注重的是特性,也就是方法。

第二个阶段

也是抽取名词,但是主要是通过名词的概念去理解系统,包括系统包含的模块以及通过名词了解系统各模块之间的关系,在具体点就是名词之间的业务流程;而面向过程:主要注重业务实现的逻辑。

第三个阶段

主要是在解决一些系统设计时复杂的算法,复杂的逻辑,主要是用到设计模式来解决。
学习设计模式:《大会西游之设计模式》《head first 设计模式》
学习套路:关注每个设计模式之前所描述的问题,自己思考如果自己遇到这样的问题该怎么解决,然后对比看看设计是怎么解决的,这样来学习设计模式就更高效也更能深入的理解。

在用面向对象抽取对象名词时,什么时候应该拆分名词?

一份对象的固有属性就是能够体现这个对象生命周期的的属性,是在描述这个对象时不可缺少的属性,其他的属性原则上都是可以拆开的。
另外,抽实体还应遵从原子性,要弄明白名词属性的来龙去脉,一般手动输入的,或者操作产生的就是原子属性。
冗余字段的原则?
一旦生成就不能改变,话句话说,此字段所描述对象的职责不会发生改变,你这个字段就是可以冗余的。

java之面向对象的基础知识的更多相关文章

  1. PHP基础入门(五)---PHP面向对象实用基础知识

    前言: 今天来和大家介绍一下PHP的面向对象.说到面向对象,我不得不提一下面向过程,因为本人在初学时,常常分不清楚面向对象和面向过程,下面就来给大家介绍一下它们的区别: 面向对象专注于由哪个对象来处理 ...

  2. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  3. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  4. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  5. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  6. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  7. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  8. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  9. java前三本基础知识总结

    基础软件:1:JDK,JRE,JVM(一些参数和作用),GC(机制和算法),Class,Loader(机种作用,加载顺序) 2:环境搭建:JAVA_HOME,path,class 语言基础:引用类型: ...

随机推荐

  1. java框架篇---hibernate入门

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...

  2. [转载][IoC容器Unity]第二回:Lifetime Managers生命周期

    1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...

  3. AI金融知识自学偏量化方向-了解不同类型的机器学习2

    有监督学习 vs 无监督学习 迭代和评估 偏差方差权衡 结合有监督学习和无监督学习(半监督学习)

  4. 解决:android源码同步repo sync 时出现的fatal:duplicate path错误

    问题重现: 解决方法: 1.删除android项目里隐藏的 .repo 文件夹中除了以下几个文件夹的其他文件及文件夹 2.重新初始化android项目 repo init -u https//gith ...

  5. Git 补丁操作

    补丁是文本文件,其内容是相似于Git diff,但随着代码,它也有元数据有关提交,如提交ID,日期,提交信息等,我们可以创建补丁提交和其他人可以将它们应用到自己的资料库. Jerry 为他们的项目实现 ...

  6. MySQL 5.7的安装及主从复制(主从同步)

    1.master上开启binlog日志,配置如下 一般mysql配置文件在目录/etc下,叫my.cnf (如果找不到的话也有可能在这些目录下:/etc/my.cnf,/etc/mysql/my.cn ...

  7. 在windows下安装git后没有ssh文件夹

    在windows7下安装git后,运行 cd ~/.ssh $ bash: cd: /c/Users/Administrator/.ssh: No such file or directory 出现以 ...

  8. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    一.前言 在前面的文章Mysql系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个: 1. 分布式全局唯一id 2. 分片规则和策略 3. 跨分片技术问题 4. 跨分片事物 ...

  9. SpringMVC注解@RequestParam与RequestMapping全面解析

    1.@RequestParam用法: SpringMVC后台控制层获取参数的方式主要有两种, 一种是request.getParameter("name"), 另外一种是用注解@R ...

  10. 关于tomcat7服务下面js无法获取JSESSIONID的cookie信息

    http://tomcat.apache.org/tomcat-5.5-doc/config/context.html Does anyone know what changed in the con ...