1、一切都是对象,用引用控制对象
引用与对象是相互独立存在的
例如:
String s; //定义一个引用s,s没有与任何对象关联
String s = "hello" //定义一个引用s,并与对象关联
2、对象的作用域
{
String s = new String("hello");
}
引用s在作用域终点处消失了,但是s所指向的String对象永远占据着内存空间
3、对象赋值和函数传参
对象赋值,如:
String s1 = "aaaaa";
String s2 = "bbbbb";
s1 = s2; //s1与s2指向同一个对象"bbbbb"
函数传参,如
void set(String price){
price = "100"; //传递的是String对象的引用,所以可以正确修改对象的值
}
4、JAVA垃圾回收器
垃圾回收器只回收由new分配的内存,当对象不是通过new(C/C++中malloc)而获得了一块"特殊"的内存区域,这种情况下,垃圾回收器(没法执行free方法)是没办法释放这块内存的。
调用finalize方法,垃圾回收器会在下一次垃圾回收动作执行时,回收无效对象的内存。
在C/C++中,在堆上创建对象的代价是十分昂贵的,但是在JAVA中,由于垃圾回收机制的存在,在堆上创建对象的速度竟然可以和C/C++相媲美(JAVA中所有对象,除了基本类型,都在堆上创建)。
引用计数,由于对象之间的相互引用的问题,通常并不会在JAVA虚拟机中被使用。垃圾回收的思想:对于任何"活的对象",一定能够追溯到其存活在堆栈或者静态存储区中的引用,这个引用可能会贯穿数个对象的层次。