java之面向对象的基础知识
面向对象其实是种思想,凡是思想都是比较抽象的,所以我们总要找到一些方法使它便于我们理解;建模就是最常用的方式,而建模的一个特点就是减少关注度,尽量减少对具体细节的关注,这在面向对象三大特性中深有体现。
其实面向对象的三大特性并不是面向对象所必需的,只是在面向对象建模时为了解决一些共性的问题而总结出来的;具体三大特性的由来和要解决的问题看“三大特性解释”。而五大原则则是在实现这三大特性时或者说再具体操作这三大特性时,为了让我们少走弯路,经过长时间积累和验证,总结出来一些行之有效的思维方式。而设计模式则是具体经典场景的解决方案。
面向对象的三大特性:
封装
封装就是把客观事物封装成抽象的类,并且此类可以把自己的属性和方法只对信任的类开放,对不信任的类封闭。
换句话说,我们之所以封装就是为了减少我们对一个对象的所包含内容的关注度,对外界来说我只关心这个对象,能做什么事情,具体这个对象如何具有这些特性,或者如何做事情的我不关心,为了达到这个目的,我们就有必要对这个对象进行封装,把那些对于外界来说不需要关心的东西封装起来,不对外暴露。
继承
继承是让某个类型的类 获得另一个类型的类型的属性或方法。它是指这样一种能力,它可以使用现有类的所有功能,并且在不编写原有类的情况下对这些功能进行扩展。
换句话说,在我们考虑一类东西的不同对象时,会发现这些对象具有某些共同的特性,这样我们就可以把这些特性抽出一个父类,二子类只需要继承这个父类就行了,这样这些共有的特性就有一个对象来管理,同时其子类又具备这些特性,这样就避免了同一个东西有不同对象控制所带来的问题。
多态
是指一个实例的同个方法在不同的形态下有不同的表现形式。比如,一个类中具有多个方法名相同的方法,但是每个方法的所包含的参数是不一样的,这包括,参数个数不一样,或者参数的类型不一样,或者两者都不一样。
换句话说,一个对象在不同条件下做同一个事情的不同表现形态。
面向对象的五大原则:
单一职责原则
一个类应该只有一个引起它变化的原因,也就是说一个类的职责要单一不能保罗万象。(最近简单,最容易理解,确实最难做到的设计)
开放封闭原则
既是开放的又是封闭的,对扩展是开放的,对更改是封闭的,
例如,在对一个软件需要做出修改时,如果能够做到,不修改原有的源代码,就可以完成功能的扩展,那这个软件设计就是符合开闭原则的。
这个原则在我设计类时很有帮助,坚持这个原则就必须酒量考虑接口的封装,抽象机制和多态技术。
替换原则
依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。所谓抽象就是抽类或者接口,不能直接实例化的。细节就是具体的实现类,实现接口或者继承抽象类所产生的类,可以通过关键字new直接实例化的。
依赖倒置的本质是契约式编程,通过抽象是个各类和模块的实现相互独立,不相互影响,是各模块间实现松耦合。
例如,类A直接依赖类B,假如需要类A改为依赖类C,则必须通过代码来时达成。在这种情况下,类A所欲高层,负责具体的复杂业务实现,类B和类C属于底层,负责基本的原子操作,如果直接修改类A的话就会给程序员带来额外的风险。
解决方案,就是类A依赖一个接口I,而类B和类C实现这个接口I,类A和类B,类C间接地建立联系,这样就会大大的见地类A修改的风险。
依赖倒置给予这样一个事实,相对于细节的东西,抽象的东西要稳定的多,基于抽象的系统要比基于细节的系统稳定的多,可维护性更强。
接口隔离原则
这个原则的意思就是:使用多个专门的的接口比使用单个接口要好的多
例如,在实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现的时候花了太多的精力,而接口所定义的操作相当于对客户端的承诺,这种承诺当然是越少越好,越精炼越好,过多的承诺带来的就是你的大量精力和时间去维护!
oo编程开发的范式:
划分对象----->抽象成类----->将类组织成为层次化结构----->用类和实例进行设计和实现
面向对象编程设计的几个阶段:
第一个阶段
面向名词(POJO):就是为了数据的存储,主要是通过设计出来的数据库具体信息区理解和分析系统
POJO注重的是类的属性,但有些面向对象注重的是特性,也就是方法。
第二个阶段
也是抽取名词,但是主要是通过名词的概念去理解系统,包括系统包含的模块以及通过名词了解系统各模块之间的关系,在具体点就是名词之间的业务流程;而面向过程:主要注重业务实现的逻辑。
第三个阶段
主要是在解决一些系统设计时复杂的算法,复杂的逻辑,主要是用到设计模式来解决。
学习设计模式:《大会西游之设计模式》《head first 设计模式》
学习套路:关注每个设计模式之前所描述的问题,自己思考如果自己遇到这样的问题该怎么解决,然后对比看看设计是怎么解决的,这样来学习设计模式就更高效也更能深入的理解。
在用面向对象抽取对象名词时,什么时候应该拆分名词?
一份对象的固有属性就是能够体现这个对象生命周期的的属性,是在描述这个对象时不可缺少的属性,其他的属性原则上都是可以拆开的。
另外,抽实体还应遵从原子性,要弄明白名词属性的来龙去脉,一般手动输入的,或者操作产生的就是原子属性。
冗余字段的原则?
一旦生成就不能改变,话句话说,此字段所描述对象的职责不会发生改变,你这个字段就是可以冗余的。
java之面向对象的基础知识的更多相关文章
- PHP基础入门(五)---PHP面向对象实用基础知识
前言: 今天来和大家介绍一下PHP的面向对象.说到面向对象,我不得不提一下面向过程,因为本人在初学时,常常分不清楚面向对象和面向过程,下面就来给大家介绍一下它们的区别: 面向对象专注于由哪个对象来处理 ...
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- Java学习1——计算机基础知识
本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
- java 程序运行的基础知识【Java bytecode】
聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- [Java面试三]JavaWeb基础知识总结.
1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...
- java前三本基础知识总结
基础软件:1:JDK,JRE,JVM(一些参数和作用),GC(机制和算法),Class,Loader(机种作用,加载顺序) 2:环境搭建:JAVA_HOME,path,class 语言基础:引用类型: ...
随机推荐
- 【Unity】序列化字典Dictionary的问题
问题:在C#脚本定义了public Dictionary字典,然而在编辑器检视面板Editor Inspector中看不到(即无法序列化字典).即不能在编辑器中拖拽给字典赋值. 目标:检视面板Insp ...
- 怎么关闭win10和win8快速启动
电源选项-- 选择电源按钮的功能--- 更改当前不可用的设置-- 快速启动勾去掉
- [微信开发] 微信JSAPI - 获取用户地理位置信息
参考博客 http://blog.csdn.net/u013142781/article/details/50503299 主要JS 方法 wx.getLocation 获取地理位置信息传递参数 成功 ...
- [PGM] Variable elimination and Belief propagation
内容范围如题.Lec 08-11的内容:https://www.youtube.com/watch?v=Qa04kw1gKHk&index=36&list=PLQiVpyxVlLkbp ...
- JQuery EasyUI DataGrid获取当前行
1.获取当前行索引 var rowIndex = $('#dg').datagrid('getRowIndex', row); 2.根据索引删除当前行 $('#dg').datagrid('delet ...
- vue 本地开发时使用localhost与ip访问
修改config文件夹下面的index.js配置,将localhost改为0.0.0.0就可以了.用ip,127.0.0.1,localhost均行 host: '0.0.0.0', // can b ...
- jenkins 使用curl调用时带文件参数
最近在使用jenkins时,需要使用curl去调用,但原有的jenkins中需要有file参数,baidu查询之未找到. 特意记录下 curl -X POST http://localhost:808 ...
- 快速构建springmvc+spring+swagger2环境
快速构建springmvc+spring+swagger2环境 开发工具:Intellij idea jdk: 1.8 开发步骤: 1.创建maven工程,如图建立工程结构 ...
- PAT甲级1052 Linked List Sorting
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805425780670464 题意: 给定一些内存中的节点的地址,值 ...
- 树剖+线段树||树链剖分||BZOJ2238||Mst
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=2238 思路:先求个最小生成树,然后就对最小生成树上的边做树剖,依次对非树边进行处理,维护非树 ...