《Thinking In Java》总结, 第二章:一切都是对象

时间:2021-08-02 14:19:40

看Thinking In Java看到一半,由于看不下去了,我就从前面看过的章节往后一章一章的总结,看看自己从这些看过的章节中学到了些什么。第一章没什么可说的,直接从第二章开始吧。


Java中,一切皆对象。尽管一切都是看作对象,但是平时我们实际操作的的是对象的一个引用(当然有人说这是一个指针)。可以将这一情形想象成用遥控器(引用)来操纵电视机(对象)。只要拥有这个遥控器,那我们就可以和电视机保持连接。

此外,即使没有电视机,遥控器也可以单独存在。也就是说,拥有一个引用,并不一定需要有一个对象与他关联。例如:
String s;
这里创建的只是一个引用,而不是一个对象。如果此时向s发送一个消息,就会返回一个运行时的错误,因为s此时没有与任何东西关联(没有电视机)。因此一种安全的做法是在创建引用的时候就进行初始化。


程序运行时,对象是存在哪里的呢?内存如何分配呢?
一共有5个不同的地方可以存储数据:
1.寄存器(最快的存储区,因为他位于处理器内部。Java程序不能直接控制,程序中无法感觉到寄存器的存在(和c/c++不同))
2.堆栈(位于通用RAM(随机访问存储器)中,创建程序时,java必须知道存储在堆栈内所有项的确切生命周期。只有某些java数据存储于堆栈中–特别是对象引用,但是java对象不在于此)
3.堆(一种通用的内存池(也位于RAM),用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间,所以在堆里分配存储有很大的灵活性。在堆中存储分配和清理可能比用堆栈进行存储分配需要更多的时间)
4.常量存储(常量值通常放于程序代码内部,因为他们永远不会被改变)
5.非RAM存储

基本类型如何处理呢?也是new一个对象?然后把对象存储在堆里吗?肯定不是的。对于基本的类型,不用new创建对象,而是创建一个并非是引用的“自动”变量。这个变量直接存储值,并置于堆栈中。
但是基本类具有包装器类,使得可以在堆上创建一个非基本对象用来表示基本类型。


java每种基本类型所占存储空间的大小是确定的。并不随硬件架构的变化而变化。这种不变性是java程序比其他大多数语言编写的程序更具有可移植性的原因之一。


Java对象不具备和基本类型一样的生命周期。当用new创建一个java对象的时候,它可以存活于作用域之外。例如:

{
String s = new String("fuck you!");
}//作用域结束。

引用s在作用域终点就消失了。然而s指向的String对象仍继续占据内存空间。但是这一小段代码之后就无法访问这个对象了,因为唯一的引用已经超出了作用域的范围。

那这样下去,是不是这些还占据内存的对象会一直这样占据下去,直到把空间全部占满呢?肯定不是的。java有一个垃圾回收器。用来监视用new创建的所有对象,宾且辨别那些不会再被引用的对象。随后释放这些空间。


在类中可以设置两种类型的元素:字段(数据成员)和方法(成员函数)。字段可以是任何类型的对象,可以通过其引用与其进行通信,也可以是基本类型的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联


基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。当变量作为类的成员使用时,Java才会确保给定默认值。但是这种初始化并不适用于“局部”变量(并非某个类的字段)。因此,如何某个方法中定义有
int x;
那么x得到的可能是任意的值,而不会被自动初始化为0。所以在使用x前,应先对x一个适当的值。如何没有这么做,java编译时会返回一个错误告诉你没有赋值。


方法名和参数列表(他们合起来被称为“方法签名”)唯一地标识出某个方法。


为了给一个类库生成不会与其他名字混淆的名字,Java设计者希望程序员反过来用自己的域名,因为这样可以保证他们肯定是独一无二的。