请问这是java的什么写法?就像以前第一次遇到内部类时的样子!

野山牛 2013-11-21 07:40:27
private final static List<String> nowords = new ArrayList<String>(){{
try{
addAll(IOUtils.readLines(SearchHelper.class.getResourceAsStream("/stopword.dic")));
}catch(IOException e){
log.error("Unabled to read stopword file", e);
}
}};
其中的 new ArrayList<String>(){{...}} 。后面的双花括号里面加代码是怎么个意思?
...全文
386 20 打赏 收藏 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dong Guo 2013-11-25
  • 打赏
  • 举报
回复
引用 19 楼 u012265257 的回复:
[quote=引用 16 楼 gd920129 的回复:] [quote=引用 14 楼 u012265257 的回复:] [quote=引用 6 楼 gd920129 的回复:] [quote=引用 5 楼 gd920129 的回复:] 匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
我擦,明白了,用的很巧妙啊!!! 竟然是为了将数据添加到List里面[/quote] 你理解错了吧?List是返回值类型,和int类型一样都是修饰变量的,是把数据添加到nowords 里,nowords才是容器,我这么认为的,求大神指教.[/quote] 你可以试着写写,匿名内部类也是类,也可以有初始化块,匿名内部类里面的那个{}就是初始化块,这个初始化块中的操作将在匿名内部类被实例化时调用。[/quote] 你讲的是对的,不过不是将数据添加到List里面,是添加到nowords里,nowords才是集合容器。你觉得呢?[/quote] 我明白你的意思了,是我口误了,是将数据添加到名字叫nowords的List里面
小明再现江湖 2013-11-25
  • 打赏
  • 举报
回复
引用 16 楼 gd920129 的回复:
[quote=引用 14 楼 u012265257 的回复:] [quote=引用 6 楼 gd920129 的回复:] [quote=引用 5 楼 gd920129 的回复:] 匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
我擦,明白了,用的很巧妙啊!!! 竟然是为了将数据添加到List里面[/quote] 你理解错了吧?List是返回值类型,和int类型一样都是修饰变量的,是把数据添加到nowords 里,nowords才是容器,我这么认为的,求大神指教.[/quote] 你可以试着写写,匿名内部类也是类,也可以有初始化块,匿名内部类里面的那个{}就是初始化块,这个初始化块中的操作将在匿名内部类被实例化时调用。[/quote] 你讲的是对的,不过不是将数据添加到List里面,是添加到nowords里,nowords才是集合容器。你觉得呢?
小明再现江湖 2013-11-25
  • 打赏
  • 举报
回复
引用 16 楼 gd920129 的回复:
[quote=引用 14 楼 u012265257 的回复:] [quote=引用 6 楼 gd920129 的回复:] [quote=引用 5 楼 gd920129 的回复:] 匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
我擦,明白了,用的很巧妙啊!!! 竟然是为了将数据添加到List里面[/quote] 你理解错了吧?List是返回值类型,和int类型一样都是修饰变量的,是把数据添加到nowords 里,nowords才是容器,我这么认为的,求大神指教.[/quote] 你可以试着写写,匿名内部类也是类,也可以有初始化块,匿名内部类里面的那个{}就是初始化块,这个初始化块中的操作将在匿名内部类被实例化时调用。[/quote] 我知道了,两对花括号里面是匿名内部类。这段代码整体也可以看作是多态,=左边是父类引用.=右边是子类对象,然后new匿名内部类,生成对象。{{}}这个里面是构造代码块,构造代码块格式就是----{类{构造代码块}}。List显然是父类,ArrayList显然是子类,nowords指向子类生成的对象,也就是nowords这个容器被添加了东西,直接用nowords这个容器就可以调用许多集合里的方法。
Dong Guo 2013-11-25
  • 打赏
  • 举报
回复
引用 15 楼 u012265257 的回复:
这应该是定义一个集合容器,属于泛型,然后对其进行初始化,花括号里面是往集合容器里添加东西,并且进行了异常处理--try{} catch(){}.等号左边nowords 是被final修饰的变量,而且nowords 被List修饰,说明nowords 是集合变量.等号右边是对ArrayList容器进行初始化,然后把ArrayList赋值给nowords .至于{{}}这双花括号,我也没见过,感觉多了一对花括号。这不是匿名类。
代码格式变一下再看看,哇,这不就是初始化块么

private final static List<String> nowords = new ArrayList<String>(){
    {
    // 初始化块
        try{
            addAll(IOUtils.readLines(SearchHelper.class.getResourceAsStream("/stopword.dic")));
        }catch(IOException e){
            log.error("Unabled to read stopword file", e);
        }
    }
}; 
Dong Guo 2013-11-25
  • 打赏
  • 举报
回复
引用 14 楼 u012265257 的回复:
[quote=引用 6 楼 gd920129 的回复:] [quote=引用 5 楼 gd920129 的回复:] 匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
我擦,明白了,用的很巧妙啊!!! 竟然是为了将数据添加到List里面[/quote] 你理解错了吧?List是返回值类型,和int类型一样都是修饰变量的,是把数据添加到nowords 里,nowords才是容器,我这么认为的,求大神指教.[/quote] 你可以试着写写,匿名内部类也是类,也可以有初始化块,匿名内部类里面的那个{}就是初始化块,这个初始化块中的操作将在匿名内部类被实例化时调用。
小明再现江湖 2013-11-24
  • 打赏
  • 举报
回复
这应该是定义一个集合容器,属于泛型,然后对其进行初始化,花括号里面是往集合容器里添加东西,并且进行了异常处理--try{} catch(){}.等号左边nowords 是被final修饰的变量,而且nowords 被List修饰,说明nowords 是集合变量.等号右边是对ArrayList容器进行初始化,然后把ArrayList赋值给nowords .至于{{}}这双花括号,我也没见过,感觉多了一对花括号。这不是匿名类。
小明再现江湖 2013-11-24
  • 打赏
  • 举报
回复
引用 6 楼 gd920129 的回复:
[quote=引用 5 楼 gd920129 的回复:] 匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
我擦,明白了,用的很巧妙啊!!! 竟然是为了将数据添加到List里面[/quote] 你理解错了吧?List是返回值类型,和int类型一样都是修饰变量的,是把数据添加到nowords 里,nowords才是容器,我这么认为的,求大神指教.
小明再现江湖 2013-11-24
  • 打赏
  • 举报
回复
这应该是定义一个集合容器,属于泛型,然后对其进行初始化,花括号里面是往集合容器里添加东西,并且进行了异常处理--try{} catch(){}.等号左边nowords 是被final修饰的变量,而且nowords 被List修饰,说明nowords 是集合变量.等号右边是对ArrayList容器进行初始化,然后把ArrayList赋值给nowords .至于{{}}这双花括号,我也没见过,感觉多了一对花括号。
坚持就是幸福 2013-11-24
  • 打赏
  • 举报
回复
看不懂,我是来学习的
野山牛 2013-11-24
  • 打赏
  • 举报
回复
引用 2 楼 lichaozhi365 的回复:
匿名类?看不出哪里是匿名类,求解 {{....}}显然是类的初始化块,能调用对象的所有的方法,但这种写法哪里流传出来的,求解
是 IKAnalysis 里面 searchHelper 里面见到的
steely_chen 2013-11-22
  • 打赏
  • 举报
回复

private final static List<String> nowords = new ArrayList<String>(){{
        try{
            addAll(IOUtils.readLines(SearchHelper.class.getResourceAsStream("/stopword.dic")));
        }catch(IOException e){
            log.error("Unabled to read stopword file", e);
        }
    }}; 
是不是等同于

private final static List<String> nowords = new ArrayList<String>();
static {//静态初始化块
    try{
       nowords.addAll(IOUtils.readLines(SearchHelper.class.getResourceAsStream("/stopword.dic")));
    }catch(IOException e){
        log.error("Unabled to read stopword file", e);
    }
}
  • 打赏
  • 举报
回复
不是匿名内部类,他是定义了一个arraylist之后 ,直接在后面添加了一个初始化块,将数据add到前面这个arraylist里,有点合用的味道。
青山丶 2013-11-22
  • 打赏
  • 举报
回复
里层的花括号是 初始化块, 当构建一个对象执行构造方法前,先执行初始化块里的内容。 希望我的回答能帮到你
绝代坏坏 2013-11-22
  • 打赏
  • 举报
回复
显然不是匿名类,就是一般的初始化块而已。
Dong Guo 2013-11-22
  • 打赏
  • 举报
回复
引用 5 楼 gd920129 的回复:
匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
我擦,明白了,用的很巧妙啊!!! 竟然是为了将数据添加到List里面
Dong Guo 2013-11-22
  • 打赏
  • 举报
回复
匿名内部类没有构造函数,初始化块是可以有的,你说的就是初始化块 敢问你这个匿名内部类有什么用么? 难道是自己修改ArrayList的实现?
jdgdf566 2013-11-21
  • 打赏
  • 举报
回复
应该是构造块,每次执行构造方法之前执行
cjb7625 2013-11-21
  • 打赏
  • 举报
回复
new ArrayList<String>(){};这样是匿名内部类吧, new ArrayList<String>(){ { //这个花括号是非静态初始化块, } static { //静态初始化块 } }
明天我会更好 2013-11-21
  • 打赏
  • 举报
回复
匿名类?看不出哪里是匿名类,求解 {{....}}显然是类的初始化块,能调用对象的所有的方法,但这种写法哪里流传出来的,求解
beowulf2005 2013-11-21
  • 打赏
  • 举报
回复
匿名类,初始化块。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧