Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声明匿名内部类_Java - Fatal编程技术网

Java 声明匿名内部类

Java 声明匿名内部类,java,Java,另一种方式 rb.addActionListener(new ActionEvent(ae) { public void actionPerformed(ActionEvent ae) { nowCall(ae); } }); 看到这两个我真的很困惑。似乎没有确切的模式来声明匿名内部类 请解释匿名内部类的语法。区别在于,在第一种情况下,将其作为参数传递给方法,在第二种情况下,将其存储在局部变量中 所以你不能把这两个例子互相比较 实例化新的匿名类并将对象传递给addAct

另一种方式

rb.addActionListener(new ActionEvent(ae) {
   public void actionPerformed(ActionEvent ae) {
     nowCall(ae);
    }
});
看到这两个我真的很困惑。似乎没有确切的模式来声明匿名内部类


请解释匿名内部类的语法。

区别在于,在第一种情况下,将其作为参数传递给方法,在第二种情况下,将其存储在局部变量中

所以你不能把这两个例子互相比较

  • 实例化新的匿名类并将对象传递给
    addActionListener
    方法

  • 实例化新的匿名类并将对象分配给局部变量
    th


  • 它们都是一样的。您将匿名类放在声明后面的分号之前:
    新动作事件(ae)
    {class details,methods etc}

    线程(Runnable r)
    {public void run(){//do something}}


    在这两种情况下,您都会创建一个类的新实例,在第一个示例中,您将其用作方法的参数,在第二个示例中,您将其分配给一个变量。

    不同之处在于,您可以将接口实现为匿名内部类,也可以扩展类。在您的示例中,两个都在扩展一个类,就我所见和测试而言,第二个类无效

    更常见的是创建新的可运行实现:

    Thread th=new Thread(Runnable r) {
      public void run() {
        // do something
      }
    };
    
    // notice the ending of above 2 snippets
    
    现在,您可以覆盖普通线程的
    run
    方法:

    Thread th=new Thread(new Runnable() {
      @Override
      public void run() {
        // This implements Runnable.run
      }
    });
    
    。。。但就个人而言,我更喜欢在创建线程时单独指定
    Runnable

    现在,您在结尾处注意到的区别只是表达式是否用作参数(例如,
    addActionListener
    方法或
    Thread(Runnable)
    构造函数,或者它是否直接分配给变量
    作为一个单独的表达式,它只是以下两者之间的区别:

    Thread th=new Thread() {
      @Override
      public void run() {
        // This overrides Thread.run
      }
    };
    

    […]注意上面两个片段的结尾

    在第一个示例中,尾随的
    只是

    Thread th = new Runnable(expression);
    
    (例如,你的两个例子有不同的结尾,因为其中一个是作业的右侧。)

    线程th=…

    另一个是方法调用的参数

    …addActionListener(…
    );

    创建匿名类的语法很简单:

    rb.addActionListener(
    
    正如您所看到的,这是两个示例的模式


    发件人:

    3.12.3.匿名类的新语法

    我们已经看到了定义和实例化匿名类的语法示例。我们可以将该语法更正式地表示为:

    new SomeClassOrInterface() {
        // implementation goes here
    }
    
    或:

    new class-name ( [ argument-list ] ) { class-body }
    


    另外,第二个示例中有一个输入错误。它可能应该是
    new-Thread(){…
    new-Thread(r){…
    (尽管在后一种情况下不会调用重写的方法)。

    您不能只是“直接重写”一个方法。两个都是匿名内部类,事实上它们的声明没有任何区别。都是anon。没有区别。当然这是一个匿名类。你能告诉线程的这个特定子类的名称吗?好的,我知道了。我更改了答案。类是匿名的或内部的。你有匿名类的例子。一个内部类ss是一个有名称的非静态嵌套类。@Peter Oracle不同意您的观点。请参阅第一个代码段中的@Jon Skeet runnable接口是在runnable中实现的?@Meprogrammer:是的,这是runnable中唯一的方法。@Jon Skeet是所有构造函数中的一个,在您的第一个示例中使用的线程构造函数。@Meprogrammer:第二个,w它只有一个类型为
    Runnable
    @jonskeet的参数,我不明白“怎么做”。你能解释一下吗
    new class-name ( [ argument-list ] ) { class-body }
    
    new interface-name () { class-body }