在Java8中,接口是否打破了封装的概念?

在Java8中,接口是否打破了封装的概念?,java,oop,interface,java-8,Java,Oop,Interface,Java 8,在Java1.7之前,我很高兴地使用接口实现OOPs概念封装。这意味着如果我想对最终用户隐藏实现,那么我将只与他们共享接口,他们可以使用该接口调用我的API,例如EJB 以上内容一直有效,直到Java 1.7现在在Java 8中,我可以在接口中编写方法的实现,还可以使用default和static关键字,例如: public interface Foo { public abstract int someUnimplementedMethod(); default void

在Java1.7之前,我很高兴地使用接口实现OOPs概念封装。这意味着如果我想对最终用户隐藏实现,那么我将只与他们共享接口,他们可以使用该接口调用我的API,例如EJB

以上内容一直有效,直到Java 1.7现在在Java 8中,我可以在接口中编写方法的实现,还可以使用
default
static
关键字,例如:

public interface Foo {

    public abstract int someUnimplementedMethod();

    default void printMsg() {
        System.out.println("Hello...!");
    }

    static void sayHello() {
        System.out.println("Hello...!");
    }

}
这在Java1.8中完全有效

现在我的问题是:

  • 在Java8中,我们是否尝试使用
    default
    static
    方法引入称为部分封装的东西

  • 我知道你们中的一些人会争论,如果你们不想共享实现,那么最好在子接口中提供
    默认
    静态
    实现,并用抽象方法保留父接口,但现在不确定我是否用抽象方法编写接口,新手可能只在接口中编写整个实现。所以它提出了一个问题,最好不要允许在接口中实现方法

如果你不同意我的第二点,请提供一个解决方案

顺便说一句,我已经读到了以下内容:

默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性


我想说,这些是在Java8之前的基础上增加的特性

正如您所说,它是正确的-可以有一个默认值和静态值(仅对接口可用,不能被覆盖)

从oracle扩展包含默认方法的接口时,可以执行以下操作

  • 根本不提默认方法,它允许扩展接口继承默认方法
  • 重新声明默认方法,使其变得抽象
  • 重新定义默认方法,该方法将覆盖它
  • 所以我不知道该称之为什么(部分封装与否),它们是默认实现,可以被覆盖。隐藏实际实现仍然是这里的一个特性

    java.utils中的集合使用默认方法来支持lambda表达式。现在,在一些场景中,它可能会有所帮助

  • 在许多应用程序中,我们需要一个基本实现类,然后扩展该类,即
    BaseImplClass实现接口
    ,因此,您可以选择在接口中定义这些默认实现,如果需要,可以覆盖这些实现

  • 若您有任何帮助程序或实用程序类,您可以在接口中使用静态方法…这些方法是公共的、最终的,并且不能被重写


  • 现在,如果你想到可能发生的钻石问题(如果一个类使用相同的默认方法签名实现多个接口,我们将遇到不明确的情况。答案是否定的,在这种情况下,您将在编译时出错。您必须重写该方法。

    答案1:我确信默认方法提供了部分封装。因为当我们类内的p代码(现在可能在接口内)封装就在那里。它主要是一种当代的抽象方法,在这里我们可以提供我们想要做的事情,而不是我们想要如何做


    回答2:这不是一个新问题,新手可以做比这更危险的事情。我认为我们可以设置检查样式来禁止这种方法。

    在接口中仍然不能有字段,所以不能有状态,这也意味着封装实际上与接口的更改无关。@LouisWasserman请详细说明我们在回答部分的评论或提供一些有用的链接,您所说的“封装实际上与接口的更改无关”,这将是有帮助的。谢谢..相关:“Java1.7,很高兴我使用接口实现OOPs概念封装”…奇怪的是,接口实际上与封装或数据隐藏没有任何直接关系。“在Java 8中,我们是否试图引入一种称为默认和静态方法的部分封装?”…默认方法是达到目的的一种手段:一种在不破坏数十年的现有代码的情况下发展遗留Java接口的方法。默认方法确实在Java中引入了更多的多重继承,特别是实现(或行为)的多重继承。Java仍然禁止状态的多重继承。“在许多应用程序中,我们需要一个基本实现类……因此,您可以选择在接口中定义这些默认实现,而不是拥有一个基本实现类"…我想指出的是,接口的框架、基础或抽象实现仍然是一种有用的设计。只有在可以仅使用接口方法调用实现的情况下,才存在使用默认方法的接口替换框架实现的选项。如果需要状态,则抽象类通常仍然存在正确的调用。“我确信默认方法提供了部分封装。因为当我们在类中封装代码时(现在可能在接口中),封装就在那里。主要是一种当代的抽象方法,在这里我们可以提供我们想要做的事,而不是我们想要如何做。”…我很确定我不知道这意味着什么。