抽象过程:建立解空间(问题建模) 和问题空间 (问题存在) 关联

  1. 万物皆为对象
  2. 程序是对象的集合,通过发送消息来告知彼此要做的
  3. 每个对象都有自己的由其他对象构成的存储
  4. 所有对象都有类型
  5. 某一特定类型的所有对象可以接受相同的消息

每个对象都有一个接口 interface :挑战问题空间的元素和加空间的对象建立一一的映射

  • 每个对象只能满足某些请求,这些请求由接口定义,决定接口的是类型,接口决定了对某一特定对象可以发出的请求,与满足请求的代码还有隐藏数据构成了实现

每个对象都提供服务:对象是服务提供者,目标是创建提供理想的服务来解决问题的一些列对象

被隐藏的具体实现:访问控制让客户端和服务端可以更专注于自己的领域

  1. public任何元素都可以访问
  2. protectde继承的类可以访问protected成员
  3. private只有类型创建者和类型内部方法可以访问
  4. 默认访问权限void 包访问权限
作用域 自己 包内 子孙 其他
private 1 0 0 0
friendly 1 1 0 0
protected 1 1 1 0
public 1 1 1 1

三大特性是:封装,继承,多态

所谓封装:
也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

所谓继承:
是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

所谓多态:
就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

五大基本原则

单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

里氏替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

依赖倒置原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

迪米特法则
迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
英文简写为: LoD.迪米特法则可以简单说成:talk only to your immediate friends。 对于面向OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

  迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。

*重构:就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

*UML(Unified Modelling Language,统一建模语言)图:每个类都用一个方框表示,类名在顶部,数据成员在中间,方法在底部。中间和底部可以省略。

代码复用是面向对象语言最了不起的优点之一。

组合(has-a)或者继承(is-a)都是复用的方法。在考虑复用的时候,应该首先考虑组合,因为它更加简单灵活,在必需使用继承的场合再使用继承。

继承的意义在于:以现有类为基础,通过添加和修改创建出新的类。

新的类型不仅包括现有类型的所有成员(尽管private成员不可见),而且复制了基类的接口。

导出类与基类具有相同的类型。所以可以发送给基类对象的消息同时也可以发送给导出类对象。

使基类和导出类产生差异的方法有两种:

1. 添加新方法

2. 覆盖原有的方法

is-a和 is-like-a:

is-a:只覆盖基类的方法而不添加新方法。

is-like-a:添加新方法。

伴随多态的可互换对象

有时我们希望把一个对象不是当成特定的类型,而是当成其基类对象来对待。这种将导出类看作它的基类的过程称为上转型。

在对这个对象执行某个方法时,我们只有到运行的时候才确定哪些代码被调用,这就是“后期绑定”。

在某些语言中,必须明确地声明希望某个方法具备后期绑定属性所带来的灵活性(C++是使用virtual关键字来实现的)。在这些语言中,方法在默认情况下不是动态绑定的。而在Java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态。

Java中所有的类都继承自同一个基类,这个基类的名字就是Object。单根继承结构有许多的好处:保证了所有的对象都具备某些功能,因此可以在每个对象上执行某些基本的操作,所有对象都可以很容易地在堆上创建,参数传递也得到了极大的简化。Java的垃圾回收器就是基于单根继承结构才得以实现的。

Java的标准库中包含了大量的容器,不同的容器提供了不同类型的接口和外部行为,不同容器对于某些操作具有不同的效率。

范型(参数化类型),对创建的容器指定保存对象的类型,以此来避免下转型的不安全。

Android人生整理第二章:Java编程第一节-对象导论相关推荐

  1. 进击 !!第二章 JAVA编程基础

    第二章 JAVA编程基础 目标: 掌握java的基本语法,常量,变量,流程控制语句,方法以及数组 运用java运算符的使用 了解java代码的基本格式 2.1java 的基本语法 1. 代码的基本格式 ...

  2. 数字图像处理笔记 第二章 数字图像基础 第一节 人眼视觉特性

    第二章 数字图像基础 第一节 人眼视觉特性 一.光与电磁波 可见光谱:380mm - 780mm 光谱图: 可见光范围内,不同波长的光给人不同的色彩感觉,不同强度的光及不同强度分布的光刺激人眼,在人脑 ...

  3. 第二章java编程基础测试题_Java编程基础测试题分享

    单选题:(每道题目2分) 1. 下列哪个声明是错误的?(B) A. int i=10; B. float f=1.1; //float f=1.1f C. double d=34.4; D. byte ...

  4. (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)

    文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...

  5. (王道408考研操作系统)第二章进程管理-第一节1:进程、PCB及其特征

    注意: 本章内容涉及进程,测试环境选在Linux下,因为我们可以阅读其源代码,有助于理解 Linux中的命令不会涉及太专业,需要说明的地方都会说明,读者只需关注其功能,无需过于操心原理 有兴趣的读者可 ...

  6. (王道408考研数据结构)第二章线性表-第一节:线性表的定义和基本操作

    文章目录 一:线性表的定义 二:线性表的基本操作 一:线性表的定义 线性表(Linear List):零个或多个数据元素的有限序列 元素之间是有顺序的 若元素存在多个,则第一个元素无前驱,最后一个元素 ...

  7. (王道408考研操作系统)第二章进程管理-第一节3:进程控制(配合Linux讲解)

    文章目录 一:如何实现进程控制 二:进程控制原语 (1)进程创建 A:概述 B:补充-Linux中的创建进程操作 ①:fork() ②:fork()相关问题 (2)进程终止 A:概述 B:补充-僵尸进 ...

  8. Web前端开发笔记——第二章 HTML语言 第一节 标签、元素、属性

    目录 一.什么是HTML? 二.标签 (一)标签.元素的定义 (二)标签的嵌套 (三)标签的属性 (四)父元素.子元素.兄弟元素 三.HTML DOM树 结语 一.什么是HTML? HTML语言,即超 ...

  9. (王道408考研操作系统)第二章进程管理-第一节5:线程概念和多线程模型

    文章目录 一:引导 二:区别"进程"."线程"和"轻量级进程" (1)进程和线程的关系 (2)Linux中没有真正意义上的线程 (3)轻量级 ...

最新文章

  1. 推荐15个国外使用 CSS3 制作的漂亮网站
  2. mysql 绿色版远程访问_【Linux】MySQL解压版安装及允许远程访问
  3. JDOM是JAVA中最常用的一种解析XML的工具
  4. 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )
  5. php 多个 csv 文件,php - 如何将CSV文件上传到多个数据库目录中? - SO中文参考 - www.soinside.com...
  6. 曲线的生成算法实现_PCGPlanet1-地形生成算法简介
  7. java timeout超时不抛异常_springCloud 请求超时解决方案 java.net.SocketTimeOut Exception: Read time out 异常解决...
  8. ZAB(Zookeeper Atomic Broadcast)协议详解
  9. file_get_contents js没有渲染数据_浏览器渲染页面那些事
  10. oppoJava面试!mysql客户端安装包
  11. java单例模式使用及注意事项
  12. HDU6109 数据分割【并查集】
  13. 高斯滤波程序编写 opencv C++ CSU
  14. SingBoot集成JPA时单元测试报错:could not initialize proxy - no Session
  15. 微商分销代理新零售商城源码
  16. android代码 qq语音,仿QQ语音变声功能实现(二)---移植到android studio 并解决部分问题...
  17. 湖南软件计算机单招较好学校,长沙岳麓区计算机IT单招学校排行榜
  18. 前端自学驿站:【建议收藏】css晦涩难懂的点都在这啦
  19. Xilinx HLS 导出IP失败的最新解决方案(2022.1.15)
  20. 使用ffmpeg将多个TS视频拼接成mp4视频

热门文章

  1. 苹果市值重回第一;今年我国95所高校新增人工智能专业;美国新技术可使机器人获得触觉感知 | 每日大事件...
  2. 安卓Palette原理分析
  3. iOS动画——弹窗动画(pop动画)
  4. 有关int,Int32的疑惑解答
  5. ArrayList源码解析与相关知识点
  6. 运用VGG16神经网络进行花朵识别
  7. 将IDEA上面写的代码上传到gitee仓库保姆式教程
  8. 13.“二四六分明”与特定变格
  9. 无数据蒸馏方向文献_1
  10. 基于hexo使用github.io免费域名搭建个人博客记录