一、抽象过程

  人们所能够解决问题的复杂性直接取决于抽象的类型和质量。所谓抽象的类型指的是抽象的是什么,汇编语言是对底层机器的轻微抽象,命令式语言(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对象导论的更多相关文章

  1. Java对象导论

    Java对象导论 1.1 抽象过程 万物皆对象. 程序是对象的集合(即:类),他们通过发送消息(调用方法)来告知彼此要做的. 每个对象都有自己的由其他对象所构成的存储(引用其他对象或基本类型,即组合) ...

  2. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  3. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

  4. 《Java编程思想》读书笔记-对象导论

    计算机是头脑延伸的工具,是一种不同类型的表达媒体.本文以背景性的和补充性的材料,介绍包括开发方法概述在内的面向对象程序设计(Object-oriented Programming,OOP)的基本概念. ...

  5. java编程思想(1)--对象导论

    对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...

  6. Java 基础之一对象导论

    对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这 ...

  7. [Java编程思想] 第一章 对象导论

    第一章 对象导论 "我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来--除非赞成这个协定中规定的有 ...

  8. JavaSE基础(十二)--Java 对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...

  9. <Java编程思想>读书笔记(1)-对象导论、一切都是对象

    1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...

随机推荐

  1. 日历插件:Bootstrap的datetimepicker插件

    注意:可以选择性引入 bootstrap.min.css和bootstrap.min.js,引入样式更好控制 option选项 0-hour 1-day 2-month 3-year 4-all ye ...

  2. 死磕 java原子类之终结篇(面试题)

    概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...

  3. jquery显示隐藏效果

    通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素toggle() 方法来切换 hide() 和 show() 方法. 1.hide()隐藏元素 $(se ...

  4. iOS 应用架构 (三)

    iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.下篇主要讨论做 Vi ...

  5. IOS制作纯色背景

    // 生成纯色背景图- (UIImage *)createPureColorImageWithColor:(UIColor *)color alpha:(CGFloat)alpha size:(CGS ...

  6. ssh连接github连不上

    连接github报端口22连接不上: 输入命令展示出ssh_config内容后: vim /etc/ssh/ssh_config 或者使用open /etc/ssh/ssh_config命令在文本编辑 ...

  7. java入门第二章——java编程基础

    习题 一.填空题 (p)1.java中的程序代码都必须在一个类中定义,类使用(class)关键字来定义. (p)2.布尔常量即布尔类型的两个值,分别是(true)和(false) (p18)3.jav ...

  8. python——动态类型

    1.变量,对象,引用 变量是一个系统表的元素,拥有指向对象的连接的空间: 对象是分配的一块内存: 引用是自动形成的从变量到对象的指针: 类型属于对象,而不是变量 a=3;  变量a变成对象3的一个引用 ...

  9. uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)

    这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...

  10. Mycat实现读写分离、分库分表

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...