对象的创建:
- 堆栈中存储的是对象引用,java系统需要知道堆栈中所有项的生命周期,以便上下移动堆栈指针来分配内存或是释放内存(堆栈指针向下分配内存,向上释放内存)。----RAM 存储
- 堆用于存放所有的java对象,编译器不需要知道存储的数据在堆中存活了多长时间。当代码执行到new时,会在堆中进行存储分配。但是堆中进行存储分配和清理要比堆栈中需要更多的时间。---RAM 存储
- 常量值一般直接存储在程序代码内部。--- 有时会存储在ROM中
- 如果数据完全存活在程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。两个基本的例子:流对象和持久化对象。流对象中,对象转化成字节流,通常被发送给另一台机器;在持久化对象中,对象被存放在磁盘上,即使程序终止,它们仍然可以保持自己的状态。这种存储方式的技巧在于:把对象转化为可以存放在其他媒介上的事物,在需要时可恢复成常规的、基于RAM的对象。---非RAM存储
- 特例:基本类型。new将对象存储在堆中,如果用new创建一个对象,特别是小的,简单的变量,往往不是很有效。所以,对于基本类型,不是用new来创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中,因此更加高效。基本类型所占存储空间的大小,不会像其他语言那样随着机器硬件架构的变化而变化,这种不变性也是java比其他语言更具可移植性的原因之一。
- java提供了两个用于高精度计算的类:BigInteger和BigDecimal,这二者都没有对应的基础类型。不过,这两个类包含的方法,提供的操作和对基本类型所能执行的操作相似,只不过必须以方法调用的形式取代运算符方式进行。这么做就麻烦了很多,所以运算速度就比较慢。在这里,我们以速度换取了精度。BigInteger支持任意精度的整数,在运算中,可以准确的表示任意大小的整数值,而不会丢失任何信息。BigDe。cimal支持任意精度的定点数。例如,可以用它进行精确的货币计算。
- 关于数组:当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键值null,一旦java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象,如果试图使用一个还是null的引用,运行时将会报错。
对象的作用域:
java对象不具备与基本类型一样的生命周期,当用new创建一个对象时,它可以存活于作用域之外。对象的引用在作用域终点就消失了,对象会依然继续占据内存空间。但是这样会带来一个问题,如果java让对象继续存在,那怎么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这就是java的神奇之处,java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后释放这些对象的内存空间,以便供其他新的对象使用。
类中的字段和方法:
- 若类的某个成员是基本数据类型,即使没有进行初始化,java也会确保它获得一个默认值,以确保那些是基本类型的成员变量得到初始化,防止产生程序错误。但是这些初始值对程序来说,可能是不正确的,甚至是不合法的。所以最好明确的对变量进行初始化。
- 但是确保初始化的方法并不适用于局部变量(即并非某个类的字段)。因此,如果你在某个方法中定义 int x ; ,那么变量x得到的可能是任意值,而不会被自动初始化为0.所以在使用x前,需要对其赋予一个适当的值,否则java会在编译时返回一个错误,告诉你变量没有初始化。
- 方法的方法名和参数类别唯一的标识出了这个方法。
- java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用(当然static方法是针对类调用的,并不依赖于对象的存在),且这个对象必须能执行这个方法调用。
static 关键字:
- 通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
- 但是上述情况出导致两种无法解决的情形出现:1 ,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。2,希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也可以调用这个方法。
- static关键字可以满足上面两方面的需求。当然,由于在用static方法前不需要创建任何对象,所以对于static方法,不能简单的通过调用其他非static域或方法而没有指定某个命名对象,来直接访问非static域与方法。