Java编程思想 学习笔记1

一、对象导论

1.抽象过程
  Alan Kay曾经总结了第一个成功的面向对象语言、同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式
  1)万物皆对象
  2)程序是对象的集合,它们通过发送消息来告知彼此所要做的。要想请求一个对象,就必须对该对象发送一条消息。更具体的说,可以把消息想象为对某个特定对象的方法的调用请求。
  3)每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象。
  4)每个对象都拥有其类型。按照通用的说法,“每个对象都是某个类(class)的一个实例(instance)”。每个类最重要的区别于其他类的特性就是“可以发送什么样的消息给它”。
  5)某一特定类型的所有对象都可以接收同样的消息

2.每个对象都有一个接口
  所有对象都是唯一的,但同时也是具有相同的特性和行为的对象所属类的一部分。
  每个对象都只能满足某些请求,这些请求由对象的接口(interface)所定义。接口确定了对某一特定对象所能发出的请求。但是,程序中必须有满足这些请求的代码。这些代码和隐藏的数据一起构成了实现

3.每个对象都提供服务

  将对象想象成是”服务提供者“。这样做的好处之一:有助于提高对象的内聚性。高内聚是软件设计的基本质量要求之一:这意味着一个软件构件的各个方面”组合“的很好。

  我们经常遇到的问题是,将过多的功能都塞在一个对象里。在良好的面向对象设计中,每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。

4.被隐藏的具体实现

 将程序开发人员按照角色分为**类创建者**和**客户端程序员**。客户端程序员的目标是收集各种用来实现快速应用开发的类。类创建者的目标是创建类,这种类只向客户端程序员暴露必需的部分,而隐藏其他部分。

访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分,让他们清晰地应用服务;第二个原因就是允许库设计者可以改变类内部的工作方式而不用担心影响到客户端程序员。

5.复用具体实现
  组合:使用现有的类合成新的类,经常被视为”has-a”关系。
  创建新类时优先选择组合。

 6.继承

  可以创建一个基类型来表示系统中某些对象的核心概念,从基类型中导出其他类型,来表示此核心可以被实现的各种不同方式。
  所有可以发送给基类对象的消息同时也可以发送给导出类对象。由于通过发送给类的消息的类型可知类的类型,所以这也就意味着导出类与基类具有相同的类型
  有两种方法可以使基类与导出类产生差异。第一种:直接在导出类中添加新方法。这意味着基类不能满足你的所有需求,因此必须添加新方法;第二种是改变基类的方法,即覆盖(override)
  “是一个”与“像是一个”关系
  is-a:继承只覆盖基类的方法,结果可以用一个导出类对象来完全替代一个基类对象。被视为纯粹替代。
  has-a:新类型具有旧类型的接口,但还包含其他方法,基类无法访问新添加的方法。

7.伴随多态的可互换对象
  在处理类型的层次结构时,通常想把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。这样我们能编写出不依赖特定类型的代码。
  一个非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将被执行的代码的绝对地址。
  面向对象程序设计语言使用了后期绑定的概念。当对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。为了执行后期绑定,Java使用一小段特殊的代码来代替绝对地址调用。这段代码使用在对象存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当向一个对象发送消息时,该对象就能够知道这条消息应该做些什么。
  把导出类看做是它的基类的过程称为向上转型

8.单根继承结构
  所有类都继承自Object。
  单根继承结构保证所有对象都具备某些功能。
  单根继承结构使垃圾回收器的实现变得容易得多。

9.容器
  存储不定数量的对象。
  参数化类型
  Java SE5之前,容器存储的对象都只具有Java中的通用类型:Object。因为Object可以存储一切东西。但这种做法在涉及具体应用时则很危险,因为向下转型是不安全的,程序员需要花更多精力来处理正确的转型。
  参数化类型机制则可以解决此问题。参数化类型就是一个在编译中可以自动定制作用于特定类型上的类。称之为范型。

10.对象的创建和生命期
  怎样才能知道何时销毁这些对象?当处理完某个对象之后,系统某个部分可能还在处理它。
  对象的数据位于何处?怎样控制对象的生命周期?这里有两种方式:

  • 第一种是追求效率,对象的存储空间和生命周期可以在编写程序时确定,通过将对象置于堆栈(它们有时被称为自动变量或限域变量)或静态存储区域内来实现。
  • 第二种是在被称为堆的内存池中动态地创建对象。这样,直到运行时才知道需要多少对象、生命周期以及具体类型。

  因为存储空间是在运行时被动态管理的,所有需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。在堆栈中创建存储空间和释放空间通常各需要一条汇编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动。创建堆存储空间的时间依赖于存储机制的设计。

  动态方式有这样一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。
  Java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。
  对于允许在堆栈上创建对象的语言,编译器可以确定对象的存活时间,并可以自动销毁它。然而,如果是在堆上创建对象,编译器就会对它的生命周期一无所知。因此,Java提供了被称为“垃圾回收器”的机制,它可以自动发现对象何时不再被使用,并继而销毁它。

11.异常处理:处理错误
  大多数错误处理机制的主要问题在于,它们都依赖于程序员自身的警惕性,这种警惕性来源于一种共同的约定,而不是编程语言所强制的。
  异常处理直接把错误处理直接置于编程语言中,有时甚至置于操作系统中。
  注意,异常处理并不是面向对象语言的特征。

12.并发编程
  在计算机编程中有一个基本概念,就是在同一时刻处理多个任务的思想。许多程序设计问题都要求,程序能够停下正在做的工作,转而处理某个其他问题,然后再返回主进程。
  我们只需把任务切分成多个可独立运行的部分,从而提高程序的响应能力。在程序中,这些彼此独立运行的部分称之为线程,上述概念被称为“并发”。
  但有一个隐患:共享资源。如果有多个并行任务都要访问同一项资源,那么就会出问题。解决问题的方法是:某个任务锁定某项资源,完成其任务,然后释放资源,使其他任务可以使用这项资源。

13.Java与Internet
待补。。。。看不懂

14.总结

  Java程序中只包含以下两部分内容:用来表示问题空间概念的对象(而不是有关计算机表示方式的相关内容),以及发送给这些对象的用来表示在此空间内的行为的消息

  这一章的内容很广泛,还需要全面学习之后再回来总体把握精髓。

原文地址:https://www.cnblogs.com/fht-litost/p/8306870.html

时间: 2024-11-03 21:28:06

Java编程思想 学习笔记1的相关文章

【Java编程思想--学习笔记(一)】访问控制-包

Java编程思想–学习笔记(一) 访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 1.包:库单元 我们之所以要导入包,就是要提供一个管理名字的空间机制. 每个java文件只能有一个public类.其他私有类为主public·类提供支持. 1.1 代码组织 与编译型语言不同,java可运行程序是一组可以打包并压缩成java文档文件(JAR,使用Java的jar文档生成器)的.class文件. 使用package和import关键字,使得不会出现名称冲突问题. 注意:java包的

JAVA编程思想学习笔记——第一章 对象导论

搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的集合,它们通过发送消息来告诉彼此所要做的 3.每个对象都由自己的由其它对象所构成的存储 4.每个对象都拥有其类型 5.某一特定类型的所有对象都可以接收同样的信息  单根继承结构 所有的类都继承自单一的基类,Object.在单根集成结构中的所有对象都具有一个公用接口,所以他们归根到底都是相同的基本类型.单根集成

[Java编程思想-学习笔记]第3章 操作符

3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("Hello, world"); 我们都会感觉太冗长了,能不能简单一些呢?静态导入可以省略掉System,就像这样 import static java.lang.System.*; public class Hello { public static void main(String[] args) {

【java编程思想--学习笔记(四)】对象导论

写这篇博客的前言: 长话短说,我希望通过阅读<java编程思想>来使我的代码 简洁可用 . 目的的层次不同,首先具体的目标是,了解Java的特性和巩固Java的基础. 更抽象的目的如下: 1.期待以巩固基础的方式,使代码优美,简洁,高效. 2.使自己写的模块能够开放适度,好用. 3.形成一种对代码是否优美的审美观. 于是<Java编程思想>第一章 对象导论 由此开始. 1.1 抽象过程 java 相对于命令式语言的优势在于只针对于待解问题建模.后者所做的主要抽象要求所做问题基于计算

[Java编程思想-学习笔记]第1章 对象导论

1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, Run Anywhere". 所谓的抽象过程,可以理解为对待解问题建模.比如待解问题是一个人,那么我们可以对人进行建模,它的类型是人,有属性姓名.性别.年龄,还有行为吃饭.走路.Java能直接完全据此建模编码,而无需考虑具体的计算机结构.所以当我们阅读Java程序时,正如书上说的"当你在

java编程思想学习笔记

1.equals和==的区别(P65) java主要有两类数据类型: 基本数据类型(原始数据类型),主要有八种:byte,char,short,int,long,float,double,boolean   他们之间的比较用"==",比较的是他们的值 复合数据类型   若用"=="对他们进行比较,比较的是他们在内存中存放的地址,也就是他们的句柄,除非他们是同一个对象,他们"=="的比较结果为true,否则为false. "=="

【java编程思想--学习笔记(三)】访问控制-接口实现与类的访问权限

接口实现 什么是数据类型? java中将数据和方法包装在类中,隐藏具体的实现,其结果就是一种数据类型.(封装产生数据类型) 联想到八大基本数据类型,都具有上述的特点. 由于数据类型的上述特点,创造者将权限的边界划在数据类型的内部,将希望被访问的数据和方法与不希望被访问到的方法和数据分开,隐藏不希望被访问到的方法和数据,实际上就实现了接口和具体实现的分离. 也就是说,了解一个类如何去用,懂得其内部公开的变量和方法就可以. 类的访问权限 上面讲的都是将访问权限设置在类的内部,也可以将访问权限修饰词放

Java编程思想 学习笔记12

十二.通过异常处理错误  Java的基本理念是“结构不佳的代码不能运行”. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型.可靠的程序的生成,并且通过这种方式可以使你更加自信:你的程序中没有未处理的错误. 1.概念 C以及其他早期语言常常具有多种错误处理模式,这些模式往往建立在约定俗成的基础上,而并不属于语言的一部分.通常会返回某个特殊值或者设置某个标志,并且假定接收者将对这个返回值或标志进行检查,以判定是否发生了错误.然而,对于构造大型.健壮.可维护的程序而言,这种错误处理

【java编程思想--学习笔记(二)】访问控制-Java访问权限修饰词

如果不提供任何访问修饰词,则意味着它是"包访问权限". 2.1 包访问权限 包访问权限赋予包内的类相互访问彼此成员的权限. 应该说, 包访问权限为将类群聚在一起的行为提供了意义和理由,即建立包的目的不仅仅是为了分类和区分,更是为了是同一个包内的类可以拥有彼此的代码. 取得对某一成员访问权的途径: 1)该成员的访问修饰词为public. 2)通过不加访问权限修饰词并将目标类放在同一包内的方式. 3)继承.子类可以访问父类的public和protected修饰词的成员,但只有在父子类处于同