【问题标题】:What is this Java syntax with a section overriding a method after the constructor? [duplicate]这个Java语法是什么,在构造函数之后有一个覆盖方法的部分? [复制]
【发布时间】:2017-05-08 08:03:09
【问题描述】:

我找到了这个example,其中包含以下代码:

CompletableFuture<T> completable = new CompletableFuture<T>() {  
    @Override  
    public boolean cancel(boolean mayInterruptIfRunning) {  
        // propagate cancel to the listenable future  
        boolean result = listenableFuture.cancel(mayInterruptIfRunning);  
        super.cancel(mayInterruptIfRunning);  
        return result;  
    }  
};  

这个语法是什么意思?此方法是否覆盖类中的方法而不扩展它?

【问题讨论】:

  • 它是匿名类

标签: java syntax constructor


【解决方案1】:

此代码块创建 anonymous subclassCompletableFuture。这个匿名子类用一个新的实现覆盖了cancel(bool) 方法。匿名子类相当于创建一个 extends CompleteableFuture 的新类,但需要注意的是,在其他地方重用这个新子类并不简单。

@Override 在这种情况下并非严格必需,但它为您提供了一些好处,正如this question 的答案所述:

每次重写方法时使用它有两个好处。这样做是为了您可以利用编译器检查来确保您实际上正在覆盖您认为的方法。这样,如果您犯了拼写错误的方法名称或未正确匹配参数的常见错误,您将被警告您的方法实际上并没有像您认为的那样覆盖。其次,它使您的代码更容易理解,因为当方法被覆盖时更明显。

此外,在 Java 1.6 中,您可以使用它来标记方法何时实现接口以获得相同的好处。我认为最好有一个单独的注解(如@Implements),但总比没有好。

【讨论】:

  • 嗨,乔恩,想澄清一件事。在这种情况下,我们可以认为所有匿名类都是实际类实现的子类
  • 是的,所有匿名类都是实际类实现的子类
【解决方案2】:

这是一个anonymous class(嵌套类类型之一)。如果您对它们感兴趣,请参阅Java tutorial - Classes and Objects 了解更多类类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2011-07-06
    • 2016-12-18
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多