黑马程序员技术交流社区

标题: 匿名内部类是否可以创建构造函数 [打印本页]

作者: 马林康    时间: 2012-6-23 14:58
标题: 匿名内部类是否可以创建构造函数
能创建吗?能请举例!

作者: 张华廷    时间: 2012-6-23 15:07
能够创建,在java编程思想中有举例
public   class   Parcel7   {
    public   Wrapping   wrap(int   x)   {
        //   Base   constructor   call:
        return   new   Wrapping(x)   {   //   Pass   constructor   argument.
            public   int   value()   {
                return   super.value()   *   47;
            }
        };   //   Semicolon   required
    }
    public   static   void   main(String[]   args)   {
        Parcel7   p   =   new   Parcel7();
        Wrapping   w   =   p.wrap(10);
    }
}  
作者: 李伟    时间: 2012-6-23 15:10
因为匿名内部类没有名字,所以构造函数可以用构造代码块来代替,比如Object obj=new Demo{  {构造代码块} }
作者: 廖理    时间: 2012-6-23 15:14
明显是不行的
因为是匿名的,所以类名内部类构造函数数无从创建
因为类的构造函数名必须与类的名同名
匿名内部类显然是没有类名的,那怎么去定义其构造函数呢?所以这是无稽之谈
所以匿名内部类只能用一次。
为什么要用匿名内部类?
1.因为 类的实现代码少
2.此类没必要创建多余的对象。

作者: 马林康    时间: 2012-6-23 15:16
李伟 发表于 2012-6-23 15:10
因为匿名内部类没有名字,所以构造函数可以用构造代码块来代替,比如Object obj=new Demo{  {构造代码块} } ...

那我的参数写在哪里?
作者: 马林康    时间: 2012-6-23 15:18
张华廷 发表于 2012-6-23 15:07
能够创建,在java编程思想中有举例
public   class   Parcel7   {
    public   Wrapping   wrap(int   x) ...

怎么都没见定义wrapping这个类就直接使用了 ,难道是我的理解有误?
作者: 耿鑫    时间: 2012-6-23 15:35
不可以啊,顾名思义,匿名内部类的意思就是没有名字的类,创建某个类的对象必须调用其类的构造方法,而方法名和类名一致,连名字都没有,你在里边写一个构造函数,那构造函数名字你写什么?没办法写吧,所以不能创建构造函数,匿名内部类就是隐式继承或实现了某个接口的类,你可以把它看作是一个方法参数,这个参数的值就是这个匿名类的对象,
作者: 一生一世    时间: 2012-6-23 15:46
呵呵,这里的回答太搞笑了,楼上说行,并且还举了例子,楼下又说不能,我都怀疑你看问题了没,呵呵
作者: 一生一世    时间: 2012-6-23 15:46
呵呵,这里的回答太搞笑了,楼上说行,并且还举了例子,楼下又说不能,我都怀疑你看问题了没,呵呵
作者: 马林康    时间: 2012-6-23 15:53
{:soso_e101:}
作者: 李伟    时间: 2012-6-23 15:57
马林康 发表于 2012-6-23 15:16
那我的参数写在哪里?

构造代码块没有方法名所以不能像构造函数那样传递参数,相当于一个无参的构造函数
作者: whocases    时间: 2012-6-23 16:02
匿名内部类由于没有名字,所以它没有构造函数,如果你想要初始化它的成员变量,有下面几种方法:
如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
在这个匿名内部类中使用初始化代码块。
作者: 闾丘日月    时间: 2012-6-23 16:10
这个问题本身很奇怪,所以我查了百度,当然结果是能还是不能就要看自己的理解了,匿名内部类因为是匿名的,当然不能像平常的构造函数那样定义构造方法,于是有些聪明的程序员就将构造代码块当成是构造函数那样用,因为它无非也是对对象的初始化过程吗,这样想的话
new Runnable(){
private int i;
{  i=100; }
}
就实现了和构造函数类似的效果了。
那么如何实现构造方法的重载呢?构造代码块只有一份啊?
我这么写 new Runnable(flag){
       init(){}
        init(String name){}

       {
             swich(flag){
             case 1: init();break;
              case 1: init(name);break;
            }
        }
}
这个flag通过父类传进来,当然像我这么写Runnable肯定不行,那样我要去Runnable里面改写它的成员和构造方法。
但是仔细想想,我们的内部类要实现的接口或者要继承的父类如果也是自己定义的是不是可以定义一个标记位让匿名内部类知道到底该去寻找哪个init()方法呢?
这些想法,构造代码块代替构造函数是网上查到的,剩下的是自己随意的一些发挥,至于到底有没有用,我也不知道。
不知道这样回答你满不满意,如果你硬是要给匿名内部类加一个构造函数的话,估计修改虚拟机的源代码应该能做到,无非是让它把内部类的类名告诉你,你再来通过类名new么。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2