new 一个对象时的内存空间分配情况
Person p1 = new Person(“Tom”,0);
如果把这条语句转变一下会更容易理解
Person p1;
p1 = new Person(“Tom”,0);
执行第一句的时候,会在内存的栈内存开辟一块空间,即图上面的p1,不过,此时p1内存空间的值为null,第二句new Person(“Tom”,0);会在堆空间开辟一块内存空间,并返回该堆空间的地址,然后赋值给p1;即,上图中p1的栈内存指向了右边的堆内存;
静态变量和静态方法在内存中分配情况
Person p1 = new Person(“tom”,0);
Person p2 = new Person(“cat”,10);
执行完上面的语句后,内存中的分配情况如下
由于,age是静态变量getName()是静态方法,属于所有对象共有,所以,在内存中只有一个副本,所有的Person对象共用,执行完第一句的时候,age的值为0,到了第二句,把age的值改为了10;
对象内存赋值的案例
Person p1 = new Person(“tom”,0);
Person p2 = p1;
Person p1 = null;
执行第一句的时候,在栈空间创建了一个内存空间p1,在堆空间创建了Person对象,并把这个堆空间的地址返回给了p1,即p1指向了Person对象
执行第二句的时候,在栈空间创建了一个内存空间p2,并且把p1的值给了p2,即把Person对象的地址给了p2,所以p2也指向了Person对象 执行第三句的时候,让p1的值为null,即p1所占的栈空间的值为null,而Person对象的值没有改变,且p2仍然指向了Person对象
对象比较的内存分析
Person p1 = new Person(“tom”,0);
Person p2 = p1;
Person p3 = new Person(“tom”,0);
if(p1 == p2)
{
System.out.printfln(“p1==p2");
}
if(p1 == p3)
{
System.out.println(“p1==p3");
}
上面程序段的运行结果是
p1==p2
上面是p1、p2、p3在内存中的分配情况,p1、p2、p3的值分别为右边所指对象的地址,p1、p2指向同一块地址,所以,p1和p2的值是相等的,即p1 == p2 为true ,p1和p3所指的对象不同,所以p1 == p3 的值为false
p1和p3所指的内存空间的值是相等的,那该怎么判断呢?
object类有一个equal方法,我们自己创建的类,可以重写这个方法,在这个方法里面判断,每个属性是否相等,java库中的类,可以直接调用equal方法。
本文转载于安卓杂谈网http://www.yee4.com/blog/124.html