java - 如何使方法成为构造函数的参数

标签 java

在用 Java 制作一个小游戏时,我偶然发现了 keyListener 类,它在实例化时需要三个方法(keyTyped、keyPressed 和 keyReleased),如下所示:

JFrame.addKeyListener(new KeyListener(){
    public void keyTyped(KeyEvent evnt) {
    //blah
    }
    public void keyPressed(KeyEvent evnt) {
    //blah
    }
    public void keyReleased(KeyEvent evnt) {
    //blah
    }
});

如何获得我正在制作的类,接受方法作为上面的参数?

最佳答案

new KeyListener() { ... } 实际上创建了一个实现 KeyListener 的匿名内部类。因此,它可以访问创建它的类的任何可见字段以及调用构造函数的方法内的任何局部最终变量。

示例:

class Outer {
  int x;

  void initUI( final int z) {
    final int y = 0;        
    int nope = 1; //you can't access this since it is neither final nor a field like x

    JFrame.addKeyListener( new KeyListener() {
      public void keyTyped(KeyEvent evnt) {
        System.out.println( x + y + z ); //you can access all of them
      }
    });
  }
}

如果您想为关键监听器提供构造函数,您需要显式定义一个类,如 anonymous classes can't have custom constructors 。这意味着你必须做这样的事情(注意:伪代码):

class Outer {
  void initUI() {
    JFrame.addKeyListener( new InnerKeyListener( myParam ) );
  }

  class InnerKeyListener implements KeyListener {
    InnerKeyListener( Param p ) {
    }

    ...
  }
}

当然,你也可以将内部类放入一个单独的文件中,或者将其设为静态内部类。

关于java - 如何使方法成为构造函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38227085/

相关文章:

java - FFmpeg 音频不同步问题

java - 使用struts2从hibernate获取数据的问题

java - 在自定义适配器notifyDataSetChanged上获取NullPointerException

java - 我的 While 循环有什么问题?

java - 通过 java 套接字发送多个文件

java - couchbase 中文档类型和键值类型的区别

java - 如何绕过 array.equals(otherArray) 评估为 null?

java - 通过 Java 创建 HTTP GET 请求时遇到问题

java - 在网页上显示查询结果 - Vaadin

java - 如何在azure服务总线中一直监听队列并拦截每条消息