繁体   English   中英

参数中的Java“ new”关键字

[英]Java “new” keyword in parameter

最近,我一直在研究许多OOP设计模式,并且遇到了一些以前从未见过的奇怪事情:

Button button =  new Button(shell, SWT.PUSH);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
    // Handle the selection event
    System.out.println("Called!");
    }
}); 

具体来说,这是做什么的(例如,“ new”关键字在这里做什么)?

    button.addSelectionListener(new SelectionAdapter() {

第二个问题:

private void notifyListeners(Object object, String property, String oldValue, String newValue) {
   for (PropertyChangeListener name : listener) {
      name.propertyChange(new PropertyChangeEvent(this, "firstName", oldValue, newValue));
   }
}

这是观察者设计模式的摘要。 以我的新理解,name.propertyChange(...)创建一个PropertyChangeEvent对象,并通过Java的观察者模式实现,通过将该新对象的信息发送给观察者(或与此类似的事物)来自动通知观察者。 它是否正确?

在这里, new关键字正在创建一个匿名类。

当您需要一个侦听器来执行某些操作,并且希望将代码分组在一起,并且/或者该类是“一次性”时,这很有用,这意味着它在其他地方没有用。

这是指向匿名类的sun教程的链接 所有正常的班级规则均适用。 创建接口时,您需要实现抽象方法或所有方法。

范围稍有不同,因为您可以访问嵌套在您的匿名类中的类中声明的变量。 但是,您不能从匿名类访问局部变量,除非这些局部变量被声明为final。 例如:

Button button =  new Button(shell, SWT.PUSH);
final String someString = "hello world!";
button.addSelectionListener(new SelectionAdapter() { 
    @Override
    public void widgetSelected(SelectionEvent e) {
        // Handle the selection event
        System.out.println(someString);
    }
});

如果在更全局的范围内声明someString则不是这种情况。

关于第二个问题:

是。 您是正确的,这就是代码段中正在发生的事情。 注意到每次都会创建一个新的PropertyChangeEvent吗? 这样一来,出现在列表前面的侦听器就不会为列表后面出现的项修改PropertyChangeEvent

首先,这是Java特定的语法:C#中没有可比的语法,您必须在其中创建一个匿名类扩展object ,或者创建一个命名类的实例。

在Java中,此语法使您可以创建SelectionAdapter的匿名子类,并在您认为合适的情况下覆盖任何方法。 这等效于创建一个扩展了SelectionAdapter的命名类,该类将覆盖任何方法,就像在SelectionAdapter()构造函数调用之后的花括号中所做的那样,然后在addSelectionListener调用中使用该派生类的名称。 唯一的区别是,此类派生类将具有名称,而示例中的匿名类没有名称*供程序员使用。

*内部匿名类确实具有名称:如果查看Java编译器生成的类文件列表,则可以看到它们。 名称中带有美元符号和数字的文件对应于匿名类。

new关键字正在创建一个匿名对象。

当您要创建仅使用一次的实例时,此功能很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM