这种写作方式?

时间:2011-03-31 13:54:56

标签: java

虽然我经常遇到,但我不明白这种编写代码的方式:

Runnable r=new Runnable() {//<----- (braces start here?)
  public void run() {
    System.out.println("Hello");
  }
};  // ?
这是什么? 请非常清楚地解释。

6 个答案:

答案 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类在代码的任何其他部分中都不需要。因此,创建一个命名类是没有必要的。另一方面,您编写的代码是创建一个匿名内部类,以便类的实现正好在需要的地方。在代码中的任何其他地方都无法访问它,但这是主意,您不需要在其他地方使用它。

相关问题