首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 9接口:为什么默认修饰符转换为公共修饰符

Java 9接口:为什么默认修饰符转换为公共修饰符
EN

Stack Overflow用户
提问于 2019-02-06 11:53:10
回答 4查看 199关注 0票数 2

我的问题是关于interface的。我创建了一个接口并定义了四种方法:第一种方法是private方法;第二种是default方法;第三种是static方法;第四种是abstract方法。

在编译了这个接口并检查了它的概要之后:default方法被转换成一个public方法,并且staticabstract方法都有一个附加的public修饰符。为什么会这样呢?

代码:

代码语言:javascript
复制
 interface InterfaceProfile {

    private void privateM() {   //this method is hidden
        System.out.println("private Method");
    }

    default void defaultM() {
        System.out.println("Default Method");
    }

    static void staticM() {
        System.out.println("Static Method");
    }

    void doStuff(); //by default adds the public modifier
}

InterfaceProfile类

代码语言:javascript
复制
    D:\Linux\IDE\Workspace\OCA-Wrokspace\Ocaexam\src>javap mods\com\doubt\session\InterfaceProfile.class
Compiled from "InterfaceProfile.java"
interface com.doubt.session.InterfaceProfile {
  public void defaultM();
  public static void staticM();
  public abstract void doStuff();
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-06 12:01:07

简单:默认情况下,接口中的所有方法都是公共。您可以通过应用private来限制这一点,但是每当您不这样做时,默认情况就会出现。因此:根本不发生转换。

引用Java语言规范

接口正文中的方法可以声明为公共的或私有的(第6.6节)。如果没有提供访问修饰符,则该方法是隐式公共的。允许为接口中的方法声明指定公共修饰符,但作为一种风格,这是允许的,但作为一种风格,这是不可取的。

(在接口中拥有私有方法的能力是在Java 9中引入的,因为人们发现Java 8默认方法常常创建了这样的默认方法可以使用的私有方法,而不是使这些辅助方法公开可见)

票数 2
EN

Stack Overflow用户

发布于 2019-02-06 11:58:07

它是一个default方法的事实并没有什么区别。隐式范围为public.

以下是本教程所说的话:

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

票数 4
EN

Stack Overflow用户

发布于 2019-02-06 12:00:12

默认修饰符是公共的,因为接口声明就是这样定义的:https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

如果您想知道背后的原因,我认为定义接口的目的是确保所有实现类的良好接口,这意味着所有实现类都有明确的契约,它们需要在哪些公共可访问方法上提供这些方法。

将私有方法添加到接口中并不能满足这一主要目的,似乎更像是一种实现提示。私有和抽象方法是对接口的后期添加。

相关:是否应该使用公共访问修饰符来声明Java接口中的方法?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54553041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档