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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈圳 高级黑马   /  2013-2-23 09:36  /  1620 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈圳 于 2013-2-23 13:25 编辑

new Object(){
         void show(){
                 System.out.println("show run");
                 }}.show

在没有创建任何其他类时,主函数运行成功.
我的几点疑问:函数内部是不能创建另一个函数的.我们使用new Object用的是多态,可是现在没有其他类.就是使用Object
对于匿名内部类的使用时,毕老师总结了使用场景:
当函数的参数是接口类型引用时,如果接口中的方法不超过3个,可以通过匿名内部类来完成.
这个show()方法是随便取的,也不属于覆盖.
Object括号内的show()函数是不是一个函数的参数?还是在main()方法中定义的一个方法?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

7 个回复

正序浏览
本帖最后由 yifanqiansheng 于 2013-2-24 01:00 编辑

你的说法有错误
既然是匿名内部类  则该内部类肯定实现了继承与某个接口   
匿名内部类对象  也是对象  是一个很正常的对象  而这个show()方法不是什么参数 它是接口Object里面的抽象方法 要想new这个接口的对象必须实现此方法
按照正常的思路,接口是不能new对象的 子类必须实现接口  并实现接口中的方法才可以创建子类对象  然后子类对象再去进行调用已经实现的方法
匿名内部类等价于下面这个Demo类创建的对象d
class Person extends  Object{
void show(){
                 System.out.println("show run");
   }
}
Person d =new Person ();
匿名内部类有以下特点  
一、只不过这个对象有点胖!!这个对象必须在它的大括号里实现接口中所有的的抽象方法 ,当然也可以加入自己的方法
二、这个对象没有名字,所以一般情况这个对象只会被使用一次,
      1、比如可以作为某个函数的参数 比如创建代理类对象实例的函数
                  public static Object newProxyInstance(ClassLoader loader,
                                                                             Class<?>[] interfaces,
                                                                              InvocationHandler h)//其中InvocationHandler为接口    这里就要写一个匿名内部类对象作为参数传给这个函数

    2、还可以用这个匿名内部类对象去调用接口中的方法 当这个对象里面的多个方法需要被调用时,最好给这个对象起个名字如下
Object obj=new Object(){
         void show(){
                 System.out.println("show run");
                 }
        void method1(){
              System.out.println("method1");
               }
}
obj.show();
obj.method1();//这样更方便于调用方法

回复 使用道具 举报
匿名内部类的写法不是在传参数的时候建立一个类么?
格式应该是 对象.方法(new 对象(){});
比如这样:
Executor executor =  Executors.newCachedThreadPool();
                executor.execute(new Runnable(){
                        public void run(){
                               
                        }
                });
回复 使用道具 举报
陈圳 发表于 2013-2-23 09:58
我的意思是这个方法他写在main()方法里,而学函数的时候就说了,在一个函数内是不建立函数的,只可以嵌套函 ...

你没有在主函数里面建立函数啊。你只是在主函数里面建立了一个对象,然后让这个对象调用自己的函数

只是这个对象很特殊,他是个匿名内部类,一次性的。
回复 使用道具 举报
对于匿名内部类的使用场景即可以对于接口类(实现接口的方法),也可以是抽象类(覆盖抽象类方法)。show()函数是类方法,即不是一个函数的参数也不是main()方法中定义的一个方法。
new Object(){
         void show(){
                 System.out.println("show run");
                 }}.show()
上面的代码等价于===>:class Demo extends  Object{
void show(){
                 System.out.println("show run");
   }
}
然后 Demo demo = new Demo()
        demo.show()

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
李挺 发表于 2013-2-23 09:54
匿名内部类的书写格式是:
new 父类 ()
{

我的意思是这个方法他写在main()方法里,而学函数的时候就说了,在一个函数内是不建立函数的,只可以嵌套函数.
还有这个show()方法,他是作为什么在函数建立的?
回复 使用道具 举报
我说下我的看法吧!
首先,你new的是一个object是吧,
而你又在它后面加上了一对大括号,那么就说明你new的是object的一个子类(以内部类的形式出现的),如果是接口则表示是他的一种实现,
并且它除了从object继承来的方法外还有一个自己的shou方法,

再者,由于是用的内部类的形式来new的对象,所以编译器知道new出来的这个对象是有show方法的,因此,编译通过!

以上说的是原理部分,

至于你说的说明函数的参数呀什么的,肯定不是咯,匿名内部类也是一种类嘛,它和普通类的区别只在于它没有名字。

而show方法作为这个匿名内部类中的方法怎么可能会和参数呀什么的挂上钩呢?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
匿名内部类的书写格式是:
new 父类 ()
{
      method(){} //

}.method()

这个method(),要注意:
如果父类中有抽象方法,就必须复写所有的抽象方法,因为有抽象的方法的类就是抽象类,抽象类不能建立对象,
这里也可以自己写个方法,然后调用这个方法,因为匿名内部类是继承了父类,当然可以有自己的方法

而你的例子的意思是:Object是所有类的父类,里面没有抽象方法,当然可以来继承然后自己写个方法

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

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