虽然我经常遇到,但我不明白这种编写代码的方式:
Runnable r=new Runnable() {//<----- (braces start here?)
public void run() {
System.out.println("Hello");
}
}; // ?
这是什么?
请非常清楚地解释。
答案 0 :(得分:9)
这是一个匿名内部类。它使用大括号内的代码创建Runnable
接口的实现。除了实现接口,您还可以扩展其他类。好的方面是您可以在不显式创建单独的类的情况下执行此操作,还可以在匿名内部类的主体内引用final
局部变量(包括参数)。
有关详细信息,请参阅Java tutorial,或者只搜索相关页面加载的“匿名内部类”。
答案 1 :(得分:1)
正如其他人所说,这里创造的是一个匿名的内部阶级。具体来说,编写代码的人说:
我想创建一个覆盖“run()”方法并创建该实例的子类,而不是Runnable类的实例。我不值得花时间创建一个命名子类,因为我只打算创建这个实例。相反,只需覆盖该方法并返回我需要的子类实例。
答案 2 :(得分:1)
这是一个anonymous class声明 - 基本上是一个实现Runnable
接口的类,在内联声明和实例化为匿名嵌套类。
请注意,您也可以使用相同的方式声明匿名子类:
Object o = new Object(){
public String toString(){ return "boo!" };
}
另请注意,您可以在匿名类代码中使用封闭方法的变量,但前提是变量为final
(因为匿名类实际上获取了变量的副本)。
答案 3 :(得分:0)
我会从这些http://www.google.co.uk/search?q=anonymous+classes+tutorial 2300万个结果开始。
基本上,它允许您定义实现或子类,而无需创建完全形成的类定义。
编辑:为了您自己的兴趣,看看您是否能弄清楚这是做什么的。
Map<String, String> map = new LinkedHashMap<String, String>() {{ // two brackets
put("a", "aye");
put("b", "bee");
put("c", "see");
put("d", "dee");
put("e", "ee");
put("f", "eff");
}};
答案 4 :(得分:0)
这就是所谓的'匿名课'。
答案 5 :(得分:0)
你可以这样做:
class MyRunnable implements Runnable{
public void run() {
System.out.println("Hello");
}
}
然后:
Runnable r = new MyRunnable();
并实现同样的目标。但是,您创建的MyRunnable类在代码的任何其他部分中都不需要。因此,创建一个命名类是没有必要的。另一方面,您编写的代码是创建一个匿名内部类,以便类的实现正好在需要的地方。在代码中的任何其他地方都无法访问它,但这是主意,您不需要在其他地方使用它。