【问题标题】:What are the implicit specifier/modifiers of interface methods in Java 8?Java 8 中接口方法的隐式说明符/修饰符是什么?
【发布时间】:2018-02-20 16:19:01
【问题描述】:

我了解接口方法隐含为publicJava Docs Tutorial

接口中的所有abstractdefaultstatic方法都是 隐含public,所以你可以省略public修饰符。

除了抽象、静态和默认,哪些修饰符在 Java 8 中隐式声明。

我认为 abstract 不再隐式声明,因为 Java 8 在接口中引入了 default 方法,但我仍然收到 Intellij IDEA 中的警告

修饰符“abstract”对于接口方法来说是多余的。

public interface TestInterface {
    abstract int print();  // abstract redundant ?.
    int print2(); //legal.but public or public abstract ?.
}

【问题讨论】:

  • 我已经通过stackoverflow.com/questions/20045759/… 仍然无法澄清我的疑问。
  • 它没有方法体,因此它是abstract。它不能是隐式默认的,你不提供方法体。为什么会让人困惑?
  • 这不意味着int print2(); 被“隐式”声明为抽象吗?
  • 确实如此。这就是为什么修饰符 abstract 是多余的。
  • 没有实现的方法是抽象的,不管你声明它是不是抽象的。如果您将方法声明为默认方法,则确实需要提供一个实现,实际上是一个 default 实现。此外,接口中的所有内容都是公共的(Java 9 中引入的私有方法除外)。

标签: java intellij-idea java-8


【解决方案1】:

language spec - 特别是第 9.4 节,声明 abstractpublic 是隐含的。

接口主体中的每个方法声明都是隐式公共的(第 6.6 节)。允许但不鼓励在接口中为方法声明冗余指定 public 修饰符。

缺少默认修饰符或静态修饰符的接口方法是隐式抽象的,因此它的主体由分号表示,而不是块。允许但不鼓励为此类方法声明冗余地指定抽象修饰符。

这就是 IntelliJ 警告您的原因;通过 JLS,您正在做一些完全多余的事情。

作为奖励,fields in interfaces 隐含为public static final

接口主体中的每个字段声明都是隐式的公共、静态和最终的。允许为此类字段冗余地指定任何或所有这些修饰符。

【讨论】:

    【解决方案2】:

    在 Java 7 和 Java 8 中,接口中定义的所有 fields总是publicstaticfinal。方法是publicabstract

    因为您的print() 方法没有主体,这意味着它是一个抽象方法。换句话说,不需要显式声明abstract,这就是为什么Intellij IDEA 说是redundant

    没有staticdefault 的方法不是隐式抽象的,即使它有一个主体。具有非默认或静态主体的非抽象方法不能存在于接口中。

    【讨论】:

    • 即使该方法有一个主体,该方法也是隐式抽象的,因为它在一个接口中并且没有明确声明为默认/静态。
    • 我同意“没有任何方法可以同时具有主体和抽象”。但是在接口内部,没有静态或默认的方法是隐式抽象的,即使它有一个主体。我想说的是,有没有实体的方法不是标准。在接口内部,不是静态/默认使其隐式抽象。因此public interface Test { int print2(){} } 给出了一个错误,说接口 abstract 方法不能有主体。
    • @SebinBenjamin 对不起,我需要告诉你,你又错了。 methods without static or default are implicitly abstract, even if it has a body. 不正确。这种方法根本不能存在于接口中。您收到该错误是因为您的编辑器希望接口中的only 抽象方法。尝试使用 non-abstract 方法时出现该错误并不会使其抽象。 non-abstract 方法的主体不是默认或静态的,首先不能存在于接口中,对吧?
    • @SebinBenjamin 你的错误说得很清楚:abstract methods cannot have a body 这是正确的,换句话说,身体,我期待抽象方法,在做什么?删除正文以使其抽象或使其默认或静态。 An abstract method by definition has no body。就是这样!
    • 我已经尝试过了,在您编辑答案之前,我无法对投票做任何事情。 “除非编辑此答案,否则您的投票现在已锁定”
    【解决方案3】:

    访问修饰符

    在 Java 8 中,我们根据Java Docs Tutorials

    接口中的所有抽象、默认和静态方法都是 隐式公开,因此您可以省略 public 修饰符。

    因此,从 Java 8 开始,接口中唯一允许的访问修饰符是 public。 (Java 9引入私有接口方法)

    public interface TestInterface {
        int print();//compiles and no IDE warning
        public int print1();//public redundant
    }
    

    可选说明符

    abstract - 接口中声明为默认或静态的方法是隐式抽象,因此抽象修饰符是可选的.但这种情况下不能提供方法实现。

    static- 需要明确指定静态并提供实现。

    final - final 方法不能被覆盖,并且不允许用于接口方法。

    default - 如果提供了默认实现,则可以显式声明默认方法。

    接口中的所有字段均为publicstaticfinal

    【讨论】:

    • 我真的不喜欢唯一访问修饰符中的肯定语言,因为 Java 9 将允许 private
    • 错过了..添加了 Java 9 信息。谢谢
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2013-12-14
    • 2015-11-24
    • 2019-06-30
    • 2011-01-15
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多