Java的9接口:为什么默认修改转换成公共修改

问题描述 投票:2回答:4

我的问题是关于interface。我创建一个接口并定义四种方法:第一种方法是private方法;第二是一个default方法;第三是一个static方法;和第四是abstract方法。 编译这个接口,并检查其轮廓之后:default方法被转换成public方法,并且两个staticabstract方法具有预谋public改性剂。为什么是这样?

码:

 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类

    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();
}
java interface java-9 method-modifier
4个回答
2
投票

很简单:在默认情况下,在接口的所有方法都是公开的。您可以限制通过应用private,但只要你不这样做,在默认情况下踢这样:没有转换发生在所有。

引述Java Language Specification

在接口的主体的方法,可以声明公共或私人(6.6节)。如果没有访问修饰符,给出的方法是隐含公开。这是允许的,但不鼓励作为一个风格问题,以冗余指定公共修饰符在接口方法声明。

(有在接口的私有方法的能力与Java 9介绍,随着人们发现的Java 8默认的方法往往造成需要有,好,私有方法,这种默认的方法可以利用的,不使这些辅助方法公开可见)


4
投票

这是一个default方法不会有所作为的事实。隐式范围public

下面是the tutorial说什么:

所有抽象的,默认情况下,和静在接口中的方法都是public,这样你就可以省略公共修改。


1
投票

默认修饰符是公开的,因为那是接口声明是如何定义的:https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

如果你问了这背后的原因,我认为,定义一个接口的目的是为了保证 - 好 - 所有执行类的接口,这意味着所有的实现类有哪些公共accessable方法,他们需要提供明确的合同。

添加私有方法的接口不提供这个的主要目的似乎是更实现伏笔。私人和抽象方法是后期补充接口。

相关:Should methods in a Java interface be declared with or without a public access modifier?


1
投票

https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

所有抽象的,默认情况下,和静在接口中的方法都是public,这样你就可以省略公共修改。

实际上,实现的接口的类公开的所有的接口方法(除私人其他)到具有类的可见性的任何其他代码。

这将是非常混乱,如果一个班有一个接口,但该接口上的方法将是可见的一些代码,而不是其他。如果你想有选择地暴露方法,那么你或许应该使用多个接口。

public interface Profile {
    generalMethod() ...
}
public interface SecretProfile extends Profile {
    secretMethod() ...
}

类可以选择实现任一界面(甚至两者)。第三方代码可以检查接口的存在,并知道该方法是否可用。

© www.soinside.com 2019 - 2024. All rights reserved.