Thinking in java 学习笔记--chp02

时间:2023-02-26 17:44:44

2016年9月26日。

2.1 用引用操纵对象

在java中,一切都被视为对象,因此可以采用单一固定的语法。尽管一切都 看作对象,但操纵的标识符实际上是对象的一个“引用(reference)”。
例如我们想操纵一个词或者一个句子,可以创建一个String引用:
String s;
但这里所创建的只是引用,并不是对象。如果此时向s发送一个消息,就会返回一个运行时错误,这是英文此时s实际上没有与任何事物相关联。因此,一种安全的做法是: 创建一个引用的同时便进行初始化。
String s="abcd";
此时,我们用到了java语言的一个特性:字符串可以用带引号的文本初始化。而对于其他对象,必须采用一种更加通用的初始化方法。

2.2 必须由你创建所有对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常采用new操作符来实现这一目的。new关键字的意思是:“给我一个新对象”。所以前面的例子可以写成:
String s= new String("abcd");
除了String类型,Java提供了大量过剩的现成类型。重要的是,可以自行创建类型,事实上,这是Java程序设计中一项基本行为。

    2.2.1 对象的存储位置:

1)寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制, 也不能在程序中感觉到寄存器存在的任何迹象。
2)堆栈。位于通用RAM(随机访问存储器)中,此处不是很懂参考:http://blog.csdn.net/songjie521/article/details/3368386
3)堆。同上。
4)常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情况下,可以选择将其存放在ROM(只读存储器)中。
5)非RAM存储。

2.2.2 特例:基本类型

9种基本数据类型及其包装类

booean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
void Void

2.2.3 Java中的数组

Java确保数组会被初始化,而且不能在他的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。但由此换来的是安全性和效率的提高,因此付出的代价是值得的(并且Java有时可以优化这些操作)。

2.3 永远不需要销毁对象

大多数过程型语言都有 作用域(Scope)的概念。作用域决定了在其内定义的变量名的可见性和生命周期,Java中作用域由花括号的位置决定。
Java有一个垃圾回收器,用来监视被new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以供其他新的对象使用。我们不需要担心内存回收的问题,只需要创建对象,一旦不再需要,它们就会自行消失。这样做就消除了这类“内存泄漏”的编程问题。

2.4 创建新的数据类型:类

在Java中我们所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象。
在定义了类之后,就可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时被称作成员函数)。字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。
Java的基本成员默认值
boolean false
char '\u0000'(bull)
byte (byte)0
short (short)0
int  0
long 0L
float 0.0f
double  0.0d
然而,上述确保初始化的方法并不适用于“局部”变量。

2.5 方法、参数和返回值

感觉没什么要说的。

2.6 构建一个Java程序

static关键字

1)通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
2)有两种情形用上述方法是无法解决的。一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。另一种情形是,希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。
3)通过static关键字可以满足这两方面的需要。当声明一个事物是static的时候,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或者访问其static域。通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们一起运作的特定对象。参考:http://zhidao.baidu.com/question/294516388.html