第二章:一切都是对象
用引用操纵对象
使用new关键字创建对象。
存储到什么地方
1、register 这是最快的存储区,因为它位于存储器内部,由编译器分配。
2、stack,位于RAM中,通过堆栈指针获得直接支持。堆栈指针向下移动,分配新的内存;向上移动,则释放内存。Java引用存放在这个区域内。
3、heap,存放Java对象。不同于堆栈的好处是:编译器不需要知道要从堆中分配多少存储区域,也不必知道存储的数据在堆中存在多长时间。
4、static-storage,存放程序运行时一直存在的数据,用static关键字来标示。
5、constant-storage,存放在程序代码内部,因为他是不变的
6、non-RAM-storage 数据完全存活于程序之外。
特例:基本类型
不用new来创建非引用的变量,所有数值类型都有正负号。布尔类型所占存储空间大小没有明确规定。基本类型都有相应的包装容器类,用来产生相应的对象,这些包装容器类均是final的
高精度数字(high-precision number)
BigInteger和BigDecimal,属于包装类,必须以方法调用方式代替运算符方式进行运算,速度较慢。优点:BigInteger在运算中,可以准确表示任何大小的整数,而不丢失任何信息。BigDecimal支持任何精度的浮点数,可进行精确的货币计算。
作用域
作用域决定了在其内定义的变量名的可见性和生命周期。作用域由花括号的位置决定。例如:
{
int x=12;
//only x available
{
int q=23;
//Both x&q available
}
//Only x available
//q ”out of scope”
}
对象作用域(scope of Object)
{
int a=1;
{
int a=3;//illegal
}
}
Java对象不具备和基本类型一样的生命周期。当用new创建一个对象时,该对象在作用域之外还存在,例如:
{
String s=new String(“abc”);
}
引用s在作用域终点就消失了,然而s指向的String对象依然占用内存空间。
域和方法
每个对象都有存储它的域的空间,域不能在对象间共享。
基本成员默认值
注意:当变量为类的成员时,java才会自动初始化默认值,如果变量为方法的成员时,就需要程序员手动初始化后方可使用。
Static关键字
当声明一个事物是static时,就意味着这个数据或方法不会与包含它的那个类的任何对象实例关联在一起,所以没有创建某个类的对象,也可以调用其static方法或static数据。用static关键字修饰的方法或数据被称作“类方法”或“类数据”,因为这些数据和方法只是为了整个类,而不是为了类的某个特定对象存在的。
Static域对于每个类来说只有一份存储空间,非static域则是对每个对象有一份存储空间。