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

面向对象的三大特性:

封装

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

继承

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

多态

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

面向对象的五大原则:

单一职责原则

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

开放封闭原则

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

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

替换原则

依赖倒置原则

    高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。所谓抽象就是抽类或者接口,不能直接实例化的。细节就是具体的实现类,实现接口或者继承抽象类所产生的类,可以通过关键字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. js中如何把字符串转化为对象、数组示例代码

    很明显是一个对象,但如何把文本转为对象呢.使用eval();注意一定要加括号,否则会转换失败 把文本转化为对象 var test='{ colkey: "col", colsinf ...

  2. Java知多少(92)滚动条

    滚动条(JScrollBar)也称为滑块,用来表示一个相对值,该值代表指定范围内的一个整数.例如,用Word编辑文档时,编辑窗右边的滑块对应当前编辑位置在整个文档中的相对位置,可以通过移动选择新的编辑 ...

  3. 【转】WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: 菜单Menu的自定义样式: 右键菜单ContextMenu的自定义样式 ...

  4. jQuery图片播放插件prettyPhoto使用介绍

    演示效果  http://www.17sucai.com/preview/131993/2014-07-09/mac-Bootstrap/gallery.html 点击之后的效果 使用方法 Query ...

  5. linux memcached开机启动

    方法一: 在/etc/rc.d/rc.local 加入以下代码 /usr/local/memcached/bin/memcached -u root -d -m -l -P /tmp/memcache ...

  6. 总结一下搭建简单Web服务器的一些方法

    使用nodejs+anywhere模块搭建静态文件服务器 anywhere随时随地将你的当前目录变成一个静态文件服务器的根目录. 安装npm install anywhere -g,然后进入任意目录在 ...

  7. js的 new Date()日期格式化显示以及js获取时间戳

    一.日期格式化显示: 对 new Date() 得到日期的进行格式显示扩展,扩展方法如下: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分 ...

  8. smarty模板的内置函数

    内置函数参考:http://www.php100.com/manual/smarty/language.builtin.functions.html 主要就是 foreach 和 if elseif ...

  9. sohu_news搜狐新闻类型分类

    数据获取 数据是从搜狐新闻开放的新闻xml数据,经过一系列的处理之后,生成的一个excel文件 该xml文件的处理有单独的处理过程,就是用pandas处理,该过程在此省略 import numpy a ...

  10. L - Fire Game

    Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns) ...