Java面向对象读书笔记

Java面向对象读书笔记

在Java里任何东西都可以看作是对象,因此可以采用一种统一的语法,任何地方照搬不误,。但是尽管将一切都看作对象,但操纵的标识符实际上是指向一个对象的句柄(Handle//也有称为引用的),

可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。

​ 此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。所以如果想容纳一个词或句子,可创建一个 String 句柄:

String s;

但这里创建的只是句柄,并不是对象。若此时向s 发送一条消息,就会获得一个错误(运行期)。这是由于

s 实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无

论如何都进行初始化:

String s = "asdf";

然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初

始化类型。 From《Java编程思想》

创建对象

在创建句柄时,我们希望它和一个新的对象相连接,通常用new关键字。new的含义:把我变成这些对象中的一个新类型。所以,有: String s = new ("asdf")。

程序存储

堆栈。驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆

栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存

方式,仅次于寄存器。创建程序时,Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存

在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活

性,所以尽管有些 Java 数据要保存在堆栈里——特别是对象句柄,但Java 对象并不放到其中。

。一种常规用途的内存池(也在 RAM 区域),其中保存了Java 对象。和堆栈不同,“内存堆”或

“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要

在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new 命

令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然

会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!

静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在 RAM 里)。程序运行期间,静

态存储的数据将随时等候调用。可用static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永

远都不会置入静态存储空间。

常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数

需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。

非RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。

其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给

另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对

于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复

成普通的、基于RAM 的对象。J

Java作用域与c和c++的不同

注意尽管在 C 和 C++里是合法的,但在 Java 里不能象下面这样书写代码:

{
 int x = 12;
 {
 int x = 96; /* illegal */
 }
}

编译器会认为变量 x 已被定义。所以C 和C++能将一个变量“隐藏”在一个更大的作用域里。但这种做法在

Java 里是不允许的,因为Java 的设计者认为这样做使程序产生了混淆。

对象作用域

​ Java 对象不具备与主类型一样的存在时间。用 new 关键字创建一个Java 对象的时候,它会超出作用域的范

围之外。所以假若使用下面这段代码:

{

String s = new String("a string");

} /* 作用域的终点 */

那么句柄s 会在作用域的终点处消失。然而,s 指向的 String 对象依然占据着内存空间。在上面这段代码

里,我们没有办法访问对象,因为指向它的唯一一个句柄已超出了作用域的边界。

Java垃圾收集优点

​ 以上造成的结果便是:对于用 new 创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C

和C++里特别突出。看来在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,所以在需要对象的时候,

根本无法确定它们是否可用。而且更麻烦的是,在 C++里,一旦工作完成,必须保证将对象清除。

这样便带来了一个有趣的问题。假如Java 让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程

序的“凝固”呢。在C++里,这个问题最令程序员头痛。但 Java 以后,情况却发生了改观。Java 有一个特别

的“垃圾收集器”,它会查找用new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由

那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地

创建对象,一旦不再需要它们,它们就会自动离去。这样做可防止在 C++里很常见的一个编程问题:由于程

序员忘记释放内存造成的“内存溢出”。

posted @ 2022-01-13 11:03  奈若何!?  阅读(52)  评论(0)    收藏  举报