首页 > 编程语言 > 详细

《On java 8》阅读笔记 (1)

时间:2020-02-19 17:10:55      阅读:57      评论:0      收藏:0      [点我收藏+]

《On java 8》阅读笔记 (1)

1. 对象的概念

抽象:

我们在利用计算机解决实际问题时,除了要考虑实际问题本身,还要考虑计算结构。如简单的求和问题在用计算机解决时,得考虑数的表示,上溢等问题。抽象可以在实际问题空间和计算机的“解决方案空间”中建立一种联系。抽象的类型和质量决定了问题的复杂读。面向对象可以让我们把“实际问题”中的元素用到计算机里来。一个对象具有自己的状态,行为和标识。这意味着对象有自己的内部数据(提供状态)、方法 (产生行为),并彼此区分(每个对象在内存中都有唯一的地址)。

接口:

面向对象面临的最大一项挑战性就是:如何在“问题空间”(问题实际存在的地方)的元素与“方案空间”(对实际问题进行建模的地方,如计算机)的元素之间建立理想的“一对一”的映射关系。
类型决定了接口。
为了利用对象解决问题,给每个对象需要接受一定的请求。如让一个数可以加另一个数。每个对象仅能接受特定的请求。我们向对象发出的请求是通过它的“接口”(Interface)定义的,对象的“类型”或“类”则规定了它的接口形式。

服务提供:

我们可以将这些问题一一分解,抽象成一组服务。软件设计的基本原则是高内聚:每个组件的内部作用明确,功能紧密相关。

封装:

使用访问控制的原因有以下两点:

  1. 让应用程序员不要触摸他们不应该触摸的部分。
  2. 使类库的创建者(研发程序员)在不影响后者使用的情况下完善更新工具库。例如,我们开发了一个功能简单的工具类,后来发现可以通过优化代码来提高执行速度。假如工具类的接口和实现部分明确分开并受到保护,那我们就可以轻松地完成改造。

Java 有三个显式关键字来设置类中的访问权限:

  1. public 表示任何人都可以访问和使用该元素
  2. private 除了类本身和类内部的方法,外界无法直接访问该元素
  3. protected 类似于private 区别是子类可以访问 protected 的成员,但不能访问 private 的成员
  4. default 如果不使用前面三个显示关键字,则默认为 default 访问权限。又称包访问,因为该权限下的资源可以被同一包(库组件)中其他类的成员访问

复用:

我们可以将一个对象作为另一个对象的成员使用。

  1. 组合 (Composition) 通常用来表示“拥有”关系
  2. 聚合 (动态地组合)
    可以根据类的生命周期区分组合和聚合:整体和部件生命周期不同为聚合,相同为组合。
    相比“继承”,在创建新类时更应该考虑“组合”,因为它更简单灵活清晰。

继承:

继承通过基类和派生类的概念来表达这种相似性。基类包含派生自它的类型之间共享的所有特征和行为。创建基类以表示思想的核心。从基类中派生出其他类型来表示实现该核心的不同方式。
从现有类型继承创建新类型。这种新类型不仅包含现有类型的所有成员(尽管私有成员被隐藏起来并且不可访问),而且更重要的是它复制了基类的接口。也就是说,基类对象接收的所有消息也能被派生类对象接收。根据类接收的消息,我们知道类的类型,因此派生类与基类是相同的类型。

多态:

我们在处理类的层次结构时,通常把一个对象看成是它所属的基类,而不是把它当成具体类。通过这种方式,我们可以编写出不局限于特定类型的代码。在上个“形状”的例子中,“方法”(method)操纵的是通用“形状”,而不关心它们是“圆”、“正方形”、“三角形”还是某种尚未定义的形状。所有的形状都可以被绘制、擦除和移动,因此“方法”向其中的任何代表“形状”的对象发送消息都不必担心对象如何处理信息。
编译器如何实现这个功能: 后期绑定
通过继承,程序直到运行时才能确定代码的地址。当向对象发送信息时,被调用的代码直到运行时才确定。编译器确保方法存在,并对参数和返回值执行类型检查,但是它不知道要执行的确切代码。
把子类当成其基类来处理的过程叫做“向上转型”(upcasting)。在面向对象的编程里,经常利用这种方法来给程序解耦。
发送消息给对象时,如果程序不知道接收的具体类型是什么,但最终执行是正确的,这就是对象的“多态性”(Polymorphism)。面向对象的程序设计语言是通过“动态绑定”的方式来实现对象的多态性的。编译器和运行时系统会负责对所有细节的控制;我们只需知道要做什么,以及如何利用多态性来更好地设计程序。

单继承结构:

由于所有对象都具有一个公共接口,因此它们最终都属于同一个基类 Object

集合

对象创建与生命周期

对象的数据在哪?它的生命周期是怎么被控制的?
在 C++ 设计中采用的观点是效率第一,因此它将选择权交给了程序员。为了获得最大的运行时速度,程序员可以在编写程序时,通过将对象放在栈(Stack,有时称为自动变量或作用域变量)或静态存储区域(static storage area)中来确定内存占用和生存时间。这些区域的对象会被优先分配内存和释放。这种控制在某些情况下非常有用。
第二种方法是在堆内存(Heap)中动态地创建对象。在这种方式下,直到程序运行我们才能确定需要创建的对象数量、生存时间和类型。什么时候需要,什么时候在堆内存中创建。 因为内存的占用是动态管理的,所以在运行时,在堆内存上开辟空间所需的时间可能比在栈内存上要长(但也不一定)。在栈内存开辟和释放空间通常是一条将栈指针向下移动和一条将栈指针向上移动的汇编指令。开辟堆内存空间的时间取决于内存机制的设计。

异常处理

异常处理机制将程序错误直接交给编程语言甚至是操作系统。“异常”(Exception)是一个从出错点“抛出”(thrown)后能被特定类型的异常处理程序捕获(catch)的一个对象。它不会干扰程序的正常运行,仅当程序出错的时候才被执行。这让我们的编码更简单:不用再反复检查错误了。另外,异常不像方法返回的错误值和方法设置用来表示发生错误的标志位那样可以被忽略。异常的发生是不会被忽略的,它终究会在某一时刻被处理。

2. 万物皆对象

对象操纵

操纵是对对象的引用

对象创建

用“引用”来关联“对象”

数据存储

  1. 寄存器
  2. 栈 创建程序时,Java 系统必须准确地知道栈内保存的所有项的生命周期。这种约束限制了程序的灵活性。因此,虽然在栈内存上存在一些 Java 数据,特别是对象引用,但 Java 对象却是保存在堆内存的。
  3. 常量存储
  4. 非RAM存储

基本类型的存储

基本类型使用一个“自动”变量。 这个变量直接存储"值",并置于栈内存中。
Java 确定了每种基本类型的内存占用大小。 这些大小不会像其他一些语言那样随着机器环境的变化而变化。

数组的存储

创建对象数组时,实际上是创建了一个引用数组,并且每个引用的初始值都为 null 。

对象清理

作用域

Java 的变量只有在其作用域内才可用。且无法重新定义一个在较大作用已经存在的变量。

对象作用域

当我们使用 new 关键字来创建 Java 对象时,它的生命周期将会超出作用域。引用在作用域终点结束时,引用指向的对象还存在内存中。

类的创建

类型 class

字段 field

类的字段可以是基本类型,也可以是引用类型。如果类的字段是对某个对象的引用,那么必须要初始化该引用将其关联到一个实际的对象上

方法 method

在 Java 中,方法决定对象能接收哪些消息。方法的基本组成部分包括名称、参数、返回类型、方法体。
返回类型:
方法的返回类型表明了当你调用它时会返回的结果类型。参数列表则显示了可被传递到方法内部的参数类型及名称。方法名和参数列表统称为方法签名(signature of the method)。签名作为方法的唯一标识。
参数列表:
参数列表必须指定每个对象的类型和名称。我们并没有直接处理对象,而是在传递对象引用。

《On java 8》阅读笔记 (1)

原文:https://www.cnblogs.com/0x105/p/12331693.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!