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) 程序是对象的集合,他们通过发送消 ...
随机推荐
- Error resolving template: template might not exist or might not be accessible是一句缩水报错?
一 thymeleaf在开发的时候本地调试正常,但是在测试环境打成jar包就报这个错误了. 二 template might not exist or might not be accessible ...
- 【转】HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并 ...
- Java面向对象(static、final、匿名对象、内部类、包、修饰符、代码块)
面向对象 今日内容介绍 u final u static u 匿名对象 u 内部类 u 包的声明与访问 u 四种访问修饰符 u 代码块 第1章 final关键字 1.1 final的概念 继承的出现提 ...
- BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...
- html-jquery/js引用外部图片时遇到看不了或出现403情况解决方法
<script type="text/javascript"> function showImg(url) { var frameid = 'frameimg' + M ...
- 【js类库AngularJs】学习angularJs的指令(包括常见表单验证,隐藏等功能)
[js类库AngularJs]学习angularJs的指令(包括常见表单验证,隐藏等功能) AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀 ...
- 关于dopost和doget中文乱码问题
1.doPost方法请求方式为Post 请求内容中包含请求体,因此解决方法较简单,只要改变请求体的编码即可,具体方法setCharacterEncoding("utf-8"); 2 ...
- CF Gym 100463D Evil (二维前缀和+离散)
题意:给一些带颜色的点,求一个最小的矩形,恰好包括一半的红色点,且不包括蓝色点. 题解:暴力,求个二维前缀和,用容斥原理更新一下.N很小所以我采用了离散优化,跑了个0ms. 之前没写过二维前缀和,加上 ...
- intellij idea自定义快捷键
intellij idea自定义快捷键比较简单,自带. 首先进入idea,File-->Settings-->Live Templates. 点击右上方的“+”,第一次需要创建一个分组. ...
- python3从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 方法一:通过栈实现 # -*- coding:utf-8 -*- # class ListNode: # def __ini ...