当前位置: 首页 > 面试题库 >

为什么Java 8不允许使用非公共默认方法?

谷梁宁
2023-03-14
问题内容

让我们举个例子:

public interface Testerface {

    default public String example() {
        return "Hello";
    }

}

public class Tester implements Testerface {

    @Override
    public String example() {
        return Testerface.super.example() + " world!";
    }


}

public class Internet {

    public static void main(String[] args) {
        System.out.println(new Tester().example());
    }

}

很简单,这将打印出来Helloworld!。但是请说我正在使用返回值进行其他操作Testerface#example,例如初始化数据文件并返回不应离开实现类的敏感内部值。为什么Java不允许默认接口方法使用访问修饰符?为什么它们不能被子类保护/私有并可能被提升(类似于_扩展_ 父类的类如何为覆盖的方法使用更可见的修饰符)?

常见的解决方案是迁移到抽象类,但是在我的特定情况下,我具有枚举的接口,因此不适用于此处。我想象它要么被忽略,要么是因为接口背后的原始想法是它们是可用方法的“契约”,但是我想我希望输入有关此html" target="_blank">过程的信息。

我读过“ 为什么Java8接口方法中不允许“最终”? ”,其中指出:

默认方法的基本思想是:它是具有默认实现的接口方法,而派生类可以提供更具体的实现

在我看来,能见度完全不会破坏这一方面。

就像链接的问题一样,由于似乎很难 解决问题 ,因此 在此问题上权威的回答将是可取的 ,而不是基于观点的 回答


问题答案:

正如我们在Java8接口方法中为什么不允许“同步”的原因是什么?而为什么是“最终”不能在Java中8接口中的方法允许吗?,扩展接口以定义行为比它初看起来要微妙得多。事实证明,每种可能的修饰语都有各自的故事。这不仅仅是盲目地复制类的工作方式。(这至少在事后看来是显而易见的,因为面向单继承的面向对象建模工具不会自动用于多继承。)

让我们从一个显而易见的答案开始:接口 一直 被限制为仅具有公共成员,并且尽管我们在Java
8中向接口添加了默认方法和静态方法,但这并不意味着我们必须更改所有内容以使其“更像”类。

与with
synchronized和相比final,它本来是支持默认方法的严重错误,但较弱的可访问性(尤其是私有的)是要考虑的合理功能。私有接口方法,无论是静态的还是实例的(请注意,由于它们不参与继承,因此它们不是默认值)是一种非常明智的工具(尽管非公共帮助程序类可以轻松地模拟它们)。

实际上,我们确实考虑过在Java
8中使用私有接口方法。由于资源和时间的限制,多数情况下,这些只是从列表的底部跌落而已。此功能很有可能会在某天重新出现在待办事项列表中。(更新:接口中的私有方法已在Java
9中添加。)

打包和受保护的方法比看起来复杂得多。多重继承的复杂性和的真实含义的复杂性protected会以各种不那么有趣的方式相互作用。所以我不会为此屏住呼吸。

因此,简短的答案是,私有接口方法是我们可以在8中完成的事情,但是我们不能做所有可以完成但仍可以发货的事情,因此它被削减了,但可能会回来。



 类似资料:
  • 我们举个例子: 一个常见的解决方案是转移到一个抽象类,但是在我的具体案例中,我有一个枚举的接口,所以在这里不适用。我想这不是被忽略了,就是因为接口背后的原始想法,即它们是可用方法的“契约”,但我想我需要关于这是怎么回事的输入。 我读过“为什么Java 8接口方法中不允许使用”final“?”,其中说: 默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现 与关联问题一样,由

  • 问题内容: 我在日食中收到很多这样的警告: 变量“ myVariable”必须是私有的,并且具有访问器方法。 我想得到它们是因为我没有在eclipse中手动将protectedAllowed设置为true。但是为什么默认情况下将其设置为false?我不应该使用受保护的属性吗? 问题答案: 从理论上讲,受保护的属性(变量)在面向对象的语言中是一种反模式。如果仅子类需要访问其超类的成员属性,则将属性本

  • 为什么Java 8不允许在接口中添加toString()的默认实现? 这是错误消息:

  • 在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。

  • 问题内容: 作为ASP.NET MVC 2 Beta 2更新的一部分,默认情况下不允许JSON GET请求。看来您需要将字段设置为从控制器返回对象之前。 这背后的原因是什么?如果我正在使用JSON GET尝试进行一些远程验证,那么我应该使用其他技术吗? 问题答案: DenyGet默认的原因是在MSDN上,该链接提供了Phil Haack的博客 的详细信息。看起来像跨站点脚本漏洞。

  • 我已经阅读了许多关于堆栈溢出的文章,试图找出为什么下面的代码1不起作用,但代码2起作用。我发现在6版和7版的不同版本中,行为或编译器存在不一致性https://stackoverflow.com/questions/13864464/use-of-uninitialized-final-field-with-without-this-qualifier.这更多地涉及访问默认的最终变量,无论是否有“