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 语言基础:引用类型: ...
随机推荐
- Linux下apache activemq的安装与配置
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范 的 JMS Provider实现,尽管JMS规范出台已经是很 ...
- Sass的安装(windows 10)
1.下载ruby 下载地址:https://rubyinstaller.org/downloads/ 如果觉得下载速度过慢,可以在我的百度去下载: 链接:https://pan.baidu.com/s ...
- 史上最详细的JavaScript事件使用指南
事件流 事件流描述的是从页面中接收事件的顺序,IE和Netscape提出来差不多完全相反的事件流的概念,IE事件流是事件冒泡流,Netscape事件流是事件捕获流. 事件冒泡 IE的事件流叫做事件冒泡 ...
- [Bayes] Latent Gaussian Process Models
比较难理解,通过做题来入门. 目的:简单的了解下相关概念. 基础 热身 目的:找x到y的映射关系. 假设:Q latent functions {fi} fj 作为先验,跟x没什么直接关系,x只是作为 ...
- [Node.js] 00 - Where do we put Node.js
Ref: 前后端分离的思考与实践(五篇软文) 其实就是在吹淘宝自己的Midway-ModelProxy架构. 第一篇 起因 为了提升开发效率,前后端分离的需求越来越被重视, 同一份数据接口,我们可以定 ...
- Spark搭建HA具体解释
实验环境: zookeeper-3.4.6 Spark:1.6.0 简单介绍: 本篇博客将从下面几点组织文章: 一:Spark 构建高可用HA架构 二:动手实战构建高可用HA 三:提交程序測试HA 一 ...
- iOS开发-- 一个苹果证书如何多次使用
苹果的开发者账号限制开发者证书只能有5个,我们开发过程中遇到超过5个人需要真机调试的情况,如何解决这个问题呢? 有两种方式可以解决问题: 1. Revoke原来的证书----不推荐 将以前的证书“re ...
- 【netcore基础】.Net core使用swagger自动生成开发文档
之前写过一篇 .Net 版本的博客 https://www.cnblogs.com/jhli/p/8317566.html 现在只不过用了 netcore 之后的版本,其实差不多 netcore版本的 ...
- C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态
C#基础--类/接口/成员修饰符,多态.重载.重写,静态和非静态 类/接口/成员修饰符 C#修饰符---接口: 接口默认访问符是internal接口的成员默认访问修饰符是public C#修饰符--类 ...
- Android 监听键盘弹出和收起.
entends:http://stackoverflow.com/questions/36837066/how-to-validate-virtual-keyboard-visibility 监听键盘 ...