JavaSE——Java对象导论
一、抽象过程
人们所能够解决问题的复杂性直接取决于抽象的类型和质量。所谓抽象的类型指的是抽象的是什么,汇编语言是对底层机器的轻微抽象,命令式语言(FORTRAN、BASIC、C)是对汇编语言的抽象。这些语言所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决问题的结构。而面向对象语言则是面向解问题,将问题空间中的元素及其在解空间中的表示称之为“对象”。
对象具有状态(内部数据)、行为(方法)、标识(唯一的内存地址,也可能在硬盘中)。
- 万物皆对象。理论上来讲,可以抽取任何待解决问题的概念化构件(狗、建筑物、服务等)将其视为对象。
- 程序是对象的集合,它们通过发送消息来告诉彼此要做的。可以把消息想象为对某个特定对象的方法的调用请求。
- 每个对象都有自己的由其他对象构成的存储。也就是说,可以创建包含现有对象的包的方式来创建新的对象。
- 每个对象都有其类型。这里的类型是类的同义词。
- 某一个特定类型的所有对象都可以接受同样的消息。也就是说子类对象必须要能够接受传递给父类对象的消息。
二、每个对象都有一个接口
有人认为,类决定了接口,而类是该接口的一个特定实现。类表述了具有相同特性(数据元素)和行为(功能)的对象集合。所以,类是一个数据类型,就相当于基本类型的浮点型一样,所有的浮点型数据具有相同的特性和行为集合。如下面的代码所示,类型时Light,特定的Light对象时lt,圆点连接一个消息请求on(),面向对象的程序设计通常简单归纳为“向对象发送消息”。
Light lt=new Light();
lt.on();
三、每个对象都提供服务
将对象想象为“服务提供者”,有助于提高对象的内聚性。
四、被隐藏的具体实现
程序开发人员按照角色分为类创建者和客户端程序员。类创建者的目标是创建类,这种类只向客户端成员暴露必须的部分,而隐藏其他部分。被隐藏的部分通常代表对象内部脆弱的部分。因此,需要添加访问控制,访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分。第二个原因就是允许类库设计者可以改变类内部的工作方式而不必担心会影响到客户端程序员。
Java三个关键字public、private、protected。
- public:任何人都可以使用。
- private:只有类型创建者和类型的内部方法可以访问。
- protected:与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。
- 默认:包访问权限。
五、复用具体实现
代码复用是面向对象程序设计语言最了不起的优点之一。最简单的复用某个类的方式是直接使用该类的一个对象,此外也可以将那个类的对象置于某个新类之中,我们称之为“创建一个成员对象”。成员对象可以有多个,通常他们被声明为private,这种概念被称为组合。在创建新类时,应该首先考虑组合,因为它相较于继承更加简单灵活。
六、继承
当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(除private成员),还复制了基类的接口。也就是说,所有发给基类对象的消息同时也可以发出给导出类对象。这也就意味着基类和导出类具有相同的类型。这便是继承产生的类型等价性。
若要使基类和导出类产生差异,有两种方法:一种,在导出类中添加新方法,一种覆盖基类方法。
七、伴随多态的可互换对象
在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将它当做其基类的对象对待。下图中,BirdController对象仅能处理泛化的Bird对象,而不了解它们的具体的类型,当move()方法被调用时,即便忽略Bird的具体类型,也会产生正确的行为。因为,编译器不可能产生传统意义上的函数调用。在非面向对象程序语言中,函数调用会引起所谓的前期绑定,也就是编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。在OOP中,采用后期绑定的机制,程序直到运行时才能够确定代码的地址。也就是,当向对象对象发送消息时,被调用的代码直到运行时才能确定。编译器只确保被调用方法的存在,并对调用参数和返回值执行类型检查,但并不知道将被执行的确定代码。

class BirdController {
void reLocate(Bird bird){
bird.move();
}
}
BirdController birdController=new BirdController();
Goose goose=new Goose();
Penguin penguin=new Penguin();
birdController.reLocate(goose);
birdController.reLocate(penguin);
将导出类看做是它的基类的过程成为向上转型。
八、单根继承结构
在OOP中,除C++外,所有的类最终都继承自单一的基类——Object。因此所有对象都具有一个共用接口,所以他们归根到底都是相同的节本类型。
九、容器
如果不知道在解决某个特定问题时需要多少个对象,或者它们将存活多久,那么就可以使用容器来持有对其他对象的引用。不同的容器提供不同类型的接口和外部行为,不同的容器对于某些操作具有不同的效果。如ArrayList和LinkList,对于插入元素,LinkList明显花费的代价少。
十、对象的创建和生命期
Java采用动态内存分配方式。对象的生成和销毁方式以及其生命周期,以后再做详细讨论。
JavaSE——Java对象导论的更多相关文章
- Java对象导论
Java对象导论 1.1 抽象过程 万物皆对象. 程序是对象的集合(即:类),他们通过发送消息(调用方法)来告知彼此要做的. 每个对象都有自己的由其他对象所构成的存储(引用其他对象或基本类型,即组合) ...
- Thinking In Java读书笔记--对象导论
Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- 《Java编程思想》读书笔记-对象导论
计算机是头脑延伸的工具,是一种不同类型的表达媒体.本文以背景性的和补充性的材料,介绍包括开发方法概述在内的面向对象程序设计(Object-oriented Programming,OOP)的基本概念. ...
- java编程思想(1)--对象导论
对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...
- Java 基础之一对象导论
对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这 ...
- [Java编程思想] 第一章 对象导论
第一章 对象导论 "我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来--除非赞成这个协定中规定的有 ...
- JavaSE基础(十二)--Java 对象和类
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...
- <Java编程思想>读书笔记(1)-对象导论、一切都是对象
1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...
随机推荐
- nginx错误Upstream timed out
Upstream timed out (110: Connection timed out) while reading response header from upstream 这种情况主要在下面 ...
- Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性
Thread实现多线程: public class Thread2 extends Thread{ public int i; public void run(){ for(; i < 100 ...
- 个人博客 attack.cf
新开了个emlog搭的博客 地址:attack.cf 主要分享一下网络安全方面的东西和一些精品资源 欢迎来访
- 从零开始的Lua宅[1]:编译Lua解释器
Lua是一门神奇的脚本语言,游戏宅必备,懒人必备.Lua差多不是学起来用起来最简单的语言了,以至于简单到自身就是文档,自身就是配置文件.但是Lua的运行效率却是众多脚本中非常高的,据说仅次于V8爹下的 ...
- UI设计中蕴涵着系统重要的数据结构与功能设计
UI设计中蕴涵着系统重要的数据结构与功能设计 UI设计中的用户需求,事件(用例)驱动
- html 之table标签结构学习
一.HTML table标签结构 html 中table标签的结构情况,如下所示: <!-- table标签结构如下: <table> <thead> # thead表格 ...
- Linux下解压ZIP压缩包乱码问题
并不是所有ZIP文件都是乱码的而且导致解压失败,只有windows下压缩的ZIP在Linux中会出现这种情况.这是因为Windows和Linux下用的字符编码不同.Windows下的编码格式为GBK, ...
- python基础教程总结1——列表和元组
1.序列 python含有6种内建序列——列表,元组,字符串,Unicode字符串,buffer对象,xrange对象 2.通用序列操作 2.1 索引 注: input()根据用户输入变换相应的类 ...
- itextsharp-5.2.1-修正无法签名大文件问题
PDF文件格式几乎是所有开发平台或者业务系统都热爱的一种文档格式. 目前有很多优秀的开源PDF组件和类库.主要平时是使用.NET和Java开发,所以比较偏好使用iText,当然,它本身就很强大.iTe ...
- UVALive 4794 Sharing Chocolate(状压,枚举子集)
n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割. 预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的 ...