读书笔记 | 《Think in Java》Ⅱ一切都是对象

读书笔记 | 《Think in Java》Ⅱ一切都是对象_第1张图片
信仰牌咖啡

上篇:读书笔记 | 《Think in Java》前言&Ⅰ对象导论

Ⅱ. 一切都是对象

---4.4更新---

2.1 用引用操作对象

不同的语言操作内存中的元素不一样,比如C++是使用指针来操作对象。

在Java中,一切都被视为对象。所以我们采用“引用”来操作对象(reference)书中有一个十分精巧的比喻:将对象视作电视机,将引用视为遥控器。只要把握遥控器,就能操纵电视机。所以当我们在房间中走动时,只需要携带遥控器(引用),而不需要携带电视机了。

同时,没有电视机时,遥控器依旧可以存在,但是这容易引起运行时错误。比较好的做法是创建一个引用便进行初始化。

2.2 必须由你创建所有对象

那么,在程序运行时,对象是怎么安排的呢?内存怎么分配?

  1. 寄存器:速度最快的存储区。因为它位于处理器内部,但是数量极其有限。
  2. 堆栈:位于通用RAM中,速度仅次于寄存器,通过堆栈指针可以直接获取处理器的支持。但是创建程序时,Java系统必须知道存储在堆栈中的所有项的确切生命周期,以便移动堆栈指针。
  3. 堆:一种通用的内存池(也位于RAM区),用于存放所有的Java对象。相较于堆栈的好处:编译器不需要知道堆中的数据的生命周期,因此获得了极大的灵活性。但是代价是进行存储分配和清理需要更多的时间。
  4. 常量存储: 常量值通常存储在程序代码的内部,这样是最安全的,因为永远不会被改变。
  5. 非RAM存储: 数据完全存活于程序之外。基本粒子是流对象持久化对象。流对象中,对象转化为字节流。持久化对象通常被保存在磁盘上。

在Java中,有着一系列的基本类型,他们需要被特殊对待。基本类型变量直接存储“值”而非“引用”,并放置于堆栈中。因为假如将这些小的,简单的变量作为对象创建并放置在堆中不是很高效。

几乎所有的语言都会支持数组。不过在C++中,使用数组是很危险的,C++中,数组就是内存块,比如数组越界,数组未初始化,很容易会产生难以预料的后果。

Java会确保数组初始化,而且不能在它的范围之外被访问。这是一种范围检查,需要每个数组上少量的内存开销和运行时检查下标,这些开销相较于换来的安全性和开发效率,是很值得的。

在Java中,创建数组是相当于创建了一个引用数组,每个引用都会初始化值,该值拥有关键字null。

2.3 永远不需要销毁对象

Java将代替我们完成销毁对象,什么时候销毁对象等一系列问题。

一个Java对象可以存活于作用域之外(相较于C++),但是在作用域之外,这个对象的引用已经失效了。所以此书后续后具体介绍,在程序执行过程中,传递和复制引用。

事实证明,new创建的对象,会一直保留下去。这就出现了一个问题,Java怎样才能防止这些对象填满内存空间?这也是Java的神奇之处。Java有一个垃圾回收器,用来监视所有的对象,并判断不再会被引用的对象,将其销毁释放。具体实现原理,需要后续学习。(好奇驱使着我们继续学习下去)

2.4 创建新的数据类型:类

假如类的某个成员是基本数据类型,即使没有初始化,Java也会赋予它一个默认值,放置程序发生错误,这是Java优于C++的部分。不过,最好还是我们手动将其初始化。

2.6 构建一个Java程序

---4.5---更新
名字管理,防止命名冲突,对于工程来说,是一个比较重要的问题。C++将函数包含于类其中,避免了与其他类中的同名函数发生冲突,这仅仅解决了一小部分问题。因为C++中允许全局数据和全局函数的存在,所以C++中引入了命名空间的概念。

Java采用了一种全新的方式:Java希望程序员将自己的域名反过来使用,那么就可以保证唯一性。比如cn.jihangyu.entity.Player,句号就是目录的划分。

前文讲到,只有使用new来创建对象,才会在堆中分配内存空间。但是有两种情况在其之外:1. 为某特定的域分配一些空间,但是不需要去创建诸多对象,甚至不需要来创建对象;2. 希望某个方法不与包含它的类的对象关联到一起(有点拗口,就是说希望某个方法是依靠类来存在的,不需要依靠这个类的对象)可以直接通过类来调用方法。

此时static关键字可以满足需求。用static来声明的数据和方法,通常也被叫做“类数据”和“类方法”。

2.7 你的第一个Java程序

java.lang是默认加载到每个文件中的。

2.8 注释和嵌入式文档

代码文档比较大的一个问题,是对文档的维护。因为文档和代码是分离的,每次修改代码都需要去修改相应文档,那么这就比较乏味。

javadoc可以用来查找程序内的特殊注释标签,不仅提取标签标记的信息,也会将毗邻的类名或方法抽取出来,自动生成HTML文档。

假如你想对文档进行特殊的处理,你可以编写doclets来实现。

2.9编码风格

本书中约定的简要编码风格就不多谈了,详细可以阅读阿里巴巴前年发布的Java规范手册(公众号后台回复:“Java”,即可获取),我最近也在读。

扫一扫,关注公众号

小白的成长探索之路。

你可能感兴趣的:(读书笔记 | 《Think in Java》Ⅱ一切都是对象)