A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Spring up 中级黑马   /  2012-11-10 23:39  /  2049 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

匿名对象的作用有点迷糊!求形象解答!

点评

请及时更改帖子状态 。  发表于 2012-11-13 10:56

8 个回复

倒序浏览
1 当对对象方法只调用一次时可以用匿名对象,这样写的话代码比较简化
2 匿名对象也可以作为实际参数传递!
回复 使用道具 举报
class Demo
{
}

如果这样写:Demo d = new Demo(); 这就是有名字对象,d 就是它的名字。

如果只写: new Demo(); 这就是匿名对象,它没有名字,是一种简化写法。

当只想调用对象一次时,可以这样简写。在多态应用中,还可以用来写匿名内部类。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
解释同上。。简化代码,只调用一次对象时,可以写成new sss();
回复 使用道具 举报
匿名对象是对象的简化形式。
1、当对象只被调用一次时,使用匿名对象更为简化。
2、可以作为实际参数进行传递。
注意:当对一个对象进行多次调用时,就不可以使用匿名对象了,必须给对象起个名字。
回复 使用道具 举报
匿名对象有两种使用情况:
一、当对对象的方法仅仅进行一次调用的时候。
      注意匿名对象只能调用方法,因为匿名对象只有在调用方法时才有意义,调用属性是没有任何意义的。
      当使用匿名对象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函数结束后,还想使用那块内存,你只能事先定义一个非匿名变量了。

总结:  匿名对象只能使用一次!!!(其实匿名对象作为实参传递给了函数的形参,然后改变他的属性值,调用方法等等,这也可以看做是使用了一次,因为这个函数结束了,匿名对象就成为垃圾了。)
           所以匿名对象的用法实质就是:只能使用一次!!!(作为实参传递的用法,也只是暂时给这块内存起了个名字而已,一旦这块内存没了名字,你就找不到他,他就是垃圾了)
              
             初学者的一些理解,不妥之处,请多指教!!!

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
许坤 中级黑马 2012-11-13 10:51:38
7#
上楼写的很详细了,但是内部类和匿名类有一个特点 就是他们能访问外围类的所有成员 包括私有的,它是内部类的对象。所以你可以使用内部类给外部提供一些访问外围类私有成员的功能接口。也可以直接对抽象类及接口进行实例化,也就是在new的时候对抽象类或接口中的方法进行实现,也可以直接重写,重载所要实例化的类中的方法,也就是说它直接在new的时候生成了一个新的类,这个类继承了所要实例化的类,使得类的继承更加方便。
回复 使用道具 举报
陈军 中级黑马 2012-11-13 16:30:57
8#
你只要记住一点:
      当你只需要调用一次对象,后面不再使用这个对象。你就可以用匿名对象完成。
       (所以编程的时候经常用)

如: 匿名对象就是new 类名(), 假设有无参构造
   
回复 使用道具 举报
张综 中级黑马 2012-11-13 22:56:26
9#
匿名对象的使用(匿名没有好处)
  匿名对象在调用方法时,给方法传递参数时有时会使用匿名对象。
  fun(new Student());//使用了匿名对象
  当使用一个对象一次时,也可以用匿名对象
  Int n = new Random().nextInt(100);
  
  匿名对象:只能使用一次。
  在使用匿名对象的时候都可以改写成命名对象。
  匿名对象的好处:可以少打一行代码!没别的了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马