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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周一川 中级黑马   /  2013-3-23 19:44  /  3860 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我一直在匿名的问题上很矛盾 他们之间最跟本的区别在哪里

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-24 07:34

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
匿名对象是作为参数的传递,匿名内部类是在创建类的时候只执行一次;
回复 使用道具 举报
一个是对象,一个是类,没什么纠结的吧
回复 使用道具 举报
1:所谓 匿名对象,就是没有变量名的对象,内部类,就是名字的内部类。最根本的去别是一个是特殊的类,一个是特殊的对象。相同点都没有名字,这是匿名的含义。
2.匿名对象常用于,以下两种情况:
                 (1)当对对象的方法只调用一次时    (2) 可以将匿名对象作为实际参数进行传递 ,这样写比较简单
3 . 匿名内部类 一般用 new 类名或接口名(){      这里就是匿名内部类了。   };的形式来定以。在使用匿名内部类时.应注意以下几点:

   ·匿名内部类不能有构造方法。  
 ·匿名内部类不能定义任何静态成员、方法和类。  
 ·匿名内部类不能是public,protected,private,static。  
 ·只能创建匿名内部类的一个实例。
  ·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。  
 ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

  ·内部类只能访问外部类的静态变量或静态方法。




评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
匿名对象
匿名对象是对对象的简化形式。
一个是对象,一个是类,掌握他们各自的特点就好了,我感觉找几个经典代码分析一下应该没问题,看看我的学习日志,希望对你有帮助
匿名对象的两种使用情况
1、        当对象方法仅使用一次的时候。
2、        匿名对象可以作为实际参数进行传递。
示例:System.out.println(new Car().num);
如果对一个对象进行多个成员调用,必须给这个对象起个名字。匿名对象是一种建立对象的简化形式,简化的有自身的局限性
  1. class Car
  2. {
  3.         String color = "红色";
  4. int num = 4;// 成员变量定义在类中,整个类都可以被访问。
  5.         void run()
  6.         {
  7.                 System.out.println(color+".."+num);
  8.         }
  9.        
  10. }

  11. class  CarDemo
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 Car c = new Car();//建立一个c的类类型变量,当c作为对象建立时,c的颜色和轮胎数有了默认初始化的值,这两个成员变量随着c对象的建立,在堆内存中一起建立。示例图1
  16.                 c.color = "blue";//将对象c中成员变量color变为blue。这是在堆内存中改变的。
  17.                 c.run();//运行c的run函数,这是输出的color是blue和4
  18.                  Car c1 = new Car();//建立c1类类型变量,栈内存中有个c1,但是堆内存有new Car(),已经初始的Car内部的成员变量,c1指向new Car()的地址。示例图2.
  19.                 c1.run();//输出的是red..4
  20.                 c.num = 5;
  21.                 Car c1=c;
  22.                 c1 .color = green;
  23.                 c.run();//这个是出的是green和5,因为c的num是5,而c1指向了c的地址,c1的color改变成green的时候,也就是改变c的color,这样输出c.run()就是green和5。示例图3
  24.                 /*
  25. new Car().num = 5;//对匿名对象的成员变量赋值,为5。
  26. new Car().color = "blue";//对匿名函数的成员变量赋值,blue
  27.                 new Car().run();//运行匿名函数的成员函数,输出为红色和4.虽然有前面两条指令,但是匿名函数使用即为垃圾,第三条指令运行的仍然是堆内存中Car的初始成员变量值。不会因为上面两条指令而更改。上面两条指令会各自在堆内存中建立匿名函数。用完后会在某个时间段由java虚拟机自动垃圾回收器来管理。
  28. //基本上可以总结为,匿名对象调用属性基本没有什么意义,调用方法有意义。
  29. Car c = new Car();
  30. c.run();
  31. c.num = 4;
  32. new Car().run();
  33. 如果对一个对象进行多个成员调用,必须给这个对象起个名字。
  34.                 */
  35. //需求:汽车修配厂。对汽车进行改装,将来的车够改成黑车,三个轮胎。
  36.                 Car q = new Car();//建立q类类型变量,栈内存中有个q,但是堆内存有new Car(),已经初始的Car内部的成员变量,q指向new Car()的地址。
  37.                 show(q);// 局部变量没有默认初始化值,当作用范围结束,局部变量在栈内存中的的空间会自动释放。
  38.                 //上面的两条指令用匿名函数表示即为 show(new Car());因为没有对象,new Car()所以只在堆内存中存在,当要调用show()函数时,show中的返回对象c指向了new Car()的内存地址。而且使用完以后show在栈内存中的空间随即被释放示例图4
  39. }
  40.         public static void show(Car c)//建立一个局部函数,show,返回值为汽车类型,因为这个函数的作用就是对汽车进行改装,对象是车。所以show()后面括号内部的为Car c
  41. //若这个c改为q,那么q与上面那条指令中的q是不是同一个呢?答案是不是,
  42. //show(Car c),当q调用此函数时,c对象在堆内存中的地址赋予了q,不论字母是否相同,两者都是两个对象。见示例图5,(重点掌握)
  43.         {
  44.                 c.num = 3;//这个局部变量存在于成员函数show中,存在于栈内存中
  45.                 c.color = "black";//存在于栈内存中
  46.                 c.run();//局部成员函数调用成员函数。
  47.         }
  48. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
匿名对象,首先是new出一个对象,当这个对象只调用一次时,可以使用匿名对象来完成,这样写比较简便,其次还可以将匿名对象作为实际参数进行传递。
匿名内部类,如果一个类只使用一次,那么可以定义为匿名内部类。
使用 new 父类名(){类定义} 形式声明,先创建一个指定类的子类,然后根据这个类创建一个对象

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马