2.1 用引用操作对象
尽管一切都看作对象,单操纵的标识符实际上是对象的一个引用。例如电视机的遥控器。
推荐一种安全的做法:创建引用的同时进行初始化。
2.2 必须由你创建所有对象
new关键字的意思是“给我一个新对象”。
同样的,你可以自行创建类型。
2.2.1存储到什么地方
程序运行时,对象时怎么放置安排?内存是怎么分配呢?有五个不同的地方:
- 寄存器。这是最快的存储区,位于处理器内部,数量极其有限,会根据需求分配,也不能在程序中感受到它的存在。(C和C++允许您向编译器建议寄存器的分配方式)
- 堆栈。位于ram中,但通过堆栈指针可以从处理器那获得直接支持。向上移动则释放内存,向下移动则分配新的内存。某些java数据存在于堆栈中-比如对象引用,但是java对象并不存储在其中。
- 堆。一种通用内存池(也是ram区),用于存放所有的java对象。堆不同于堆栈的好处是不需要知道存储的数据在堆里存货了多长时间,所以,在堆里分配存储有很大的灵活性。但是灵活性必须付出代价,用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
- 常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
-
非ram存储。比如流对象和持久化对象。流对象是对象转化为字节流发送给其他机器,而持久化对象呗存放在磁盘上。所以程序终止,它们也可以保持自己的状态。
2.2.2 特例:基本类型
基本类型放在堆栈中,这个变量直接存储值,更加高效。
关于高精度数字。
2.2.3 java中的数组
java会确保数组被初始化,而且不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。但是换来的是安全性和效率的提高。
2.3 永远不需要销毁对象
java不需要主动去销毁对象。所以变量生命周期不会混乱。
2.3.1 作用域
java中,作用域由花括号的位置决定。作用域里定义的变量只能作用域作用域结束之前。
2.3.2 对象的作用域
java对象不具备和基本类型一样的生命周期。
2.4 创建新的数据类型:类
class,定义一个新的类型。
2.4.1 字段和方法
定义了一个类(在java里,你做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段和方法。
如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。
变量的默认值见下图,要记住,初始化不适用于局部变量。
2.5 方法、参数和返回值
java的方法决定了一个对象能接受什么消息。方法的基本组成部分是名称,参数,返回值和方法体。
返回类型是在调用方法之后从方法返回的值,参数列表给出了要传给方法的信息的类型和名称。方法名+参数列表才能唯一标识出某个方法。
方法只有通过对象才能够调用。
2.5.1 参数列表
方法的参数列表指定要传递给方法什么样的信息。如果参数是对象,则这里的传递实际上是传递引用。基础类型除外。
return关键字:第一,代表已经做完,离开此方法。其次,如果此方法产生一个值,这个值要放在return语句后面。
如果返回类型是void,return关键字只是退出方法。
2.6 构建一个java程序
2.6.1 名字的可见性
java解决模块冲突的问题。java设计者希望程序员反过来使用自己的internet域名,因为这样保证他们肯定是独一无二的,反转域名,句点就是目录的划分。例如com.hello.utils.都是小写。
2.6.2 运用其他构件
import可以导入你需要的包。例如:import java.util.*;
2.6.3 static 关键字
通常,用new创建对象,才会分配存储空间,才会供外界调用。
有两种情形用上述方法无法解决:
- 只想为某特定域分配单一的存储空间,而不去考虑究竟要创建多少对象,甚至根本不创建任何对象。
- 希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即时没有创建对象,也能够调用这个方法。
static变量只存在同一存储空间。类名是引用static变量及方法的首选方式。这不仅是强调了变量的static结构,而且在某些情况下编译器会优化它。
虽然static作用于某个字段时,对每个类都只有一份存储空间(非static字段是每个对象一个存储空间)。但是如果static作用于某个方法时,差别却没有那么大,只是可以不创建对象即可调用。static方法常常被拿来做“牧羊人”的角色,负责看护与其隶属于同一类型的实例群。
2.7 你的第一个java程序
打印当前日期,用到了标准库里的Date类。java.lang是默认导入每个java文件的。