匿名对象有两种使用情况:
一、当对对象的方法仅仅进行一次调用的时候。
注意匿名对象只能调用方法,因为匿名对象只有在调用方法时才有意义,调用属性是没有任何意义的。
当使用匿名对象new出一个对象后,就会在堆内存里分配一个内存来储存该对象的成员属性,这时如果你通过匿名对象改变其属性的值,一旦执行完匿名对象调用属性这句话,这个对象就已经成为垃圾了,因为这个对象是匿名的,他没有指向任何一个引用,你是无法找到这块内存的,也无法再次调用你刚才所改变的属性值。
而匿名对象调用方法则不同,至少这个方法有一个运行内容,例如该方法可以定义一个输出语句(“我昙花一现!!!”),虽然这行代码执行完,你也不会再找到这个对象了,但至少在他消失前,他还说了一句话【执行了一个输出语句(“我昙花一现!!!”)】。
由于匿名对象调用方法后,再也找不到该内存了,所以你只能调用一次,随后这个对象也成为垃圾被回收了。
如果想多次调用该对象的方法,或者调用该对象的多个方法,你只能给这个对象起个名字,而不能使用匿名对象。
二、匿名对象可以作为实际参数进行传递。
当匿名对象作为实参传递给形参时,可以看做是给这个匿名对象在这个函数体中暂时起了个名字,他的名字就是形参。有了名字当然就可以继续调用这块内存了。
例如:main()
{
show (new car());
}
public static void show (car Benz)
{
Benz.color = red;
Benz.speed = 300;
Benz.run();
}
这个例子中当主函数运行到 show (new car())时,会在堆内存中开辟一块内存存放new car();并且此时把这块内存传递给了(指向了)形参Bens,类似于给这块内存起了个名字叫做Benz,也就是类似于这样一个操作 car Benz = new car();此时这块内存有了名字,也就为继续调用这块内存提供了可能性,此时可以通过Benz.xxx来继续使用过这块内存,所以此时这块内存他不是垃圾,因为你找得到他,也可以用他。但是一旦show函数结束了,Benz这个变量也就消失了(Benz只在show函数中存活);这样那块内存又失去了指向(引用),你也找不着那块内存了,那么那块内存就垃圾了。如果你在show函数结束后,还想使用那块内存,你只能事先定义一个非匿名变量了。
总结: 匿名对象只能使用一次!!!(其实匿名对象作为实参传递给了函数的形参,然后改变他的属性值,调用方法等等,这也可以看做是使用了一次,因为这个函数结束了,匿名对象就成为垃圾了。)
所以匿名对象的用法实质就是:只能使用一次!!!(作为实参传递的用法,也只是暂时给这块内存起了个名字而已,一旦这块内存没了名字,你就找不到他,他就是垃圾了)
初学者的一些理解,不妥之处,请多指教!!!
|