有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java这种书写方式?

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

Runnable r=new Runnable() {//<----- (braces start here?)
  public void run() {
    System.out.println("Hello");
  }
};  // ?

这是什么? 请解释清楚


共 (6) 个答案

  1. # 1 楼答案

    这就是所谓的“匿名类”

  2. # 2 楼答案

    正如其他人提到的,这里创建的是一个匿名的内部类。具体来说,编写代码的人说:

    Instead of an instance of the Runnable class, I want to create a subclass that overrides the "run()" method and create an instance of that. Its not worth my time to create a named subclass, since I'm only going to create this one instance. Instead, just override the method and return the subclass instance I need.

  3. # 3 楼答案

    这是一个anonymous class声明——基本上是一个实现Runnable接口的类,以匿名嵌套类的形式内联声明和实例化

    请注意,您也可以使用相同的方式声明匿名子类:

    Object o = new Object(){
        public String toString(){ return "boo!" };
    }
    

    还请注意,您可以在匿名类代码中使用封闭方法的变量,但仅当变量为final(因为匿名类实际上获得了变量的副本)时才可以使用

  4. # 4 楼答案

    您可以这样做:

      class MyRunnable implements Runnable{
         public void run() {
            System.out.println("Hello");
         }
      }
    

    然后:

     Runnable r = new MyRunnable();
    

    实现同样的目标。但是,代码的任何其他部分都不需要您创建的MyRunnable类。因此,不需要创建命名类。另一方面,您编写的代码正在创建一个匿名内部类,以便该类的实现正好在需要它的地方。它将不会在代码中的任何其他地方访问,但这就是想法,您不需要它在任何其他地方

  5. # 5 楼答案

    我将从这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");
    }};
    
  6. # 6 楼答案

    这是一个匿名内部类。它使用大括号中的代码创建Runnable接口的实现。除了实现接口,您还可以扩展其他类。好的方面是,您可以在不显式创建单独类的情况下执行此操作,并且还可以在匿名内部类的主体中引用final局部变量(包括参数)

    有关更多详细信息,请参阅Java tutorial,或者只搜索“匿名内部类”以加载相关页面