在Java8中,接口是否打破了封装的概念?
在Java1.7之前,我很高兴地使用接口实现OOPs概念封装。这意味着如果我想对最终用户隐藏实现,那么我将只与他们共享接口,他们可以使用该接口调用我的API,例如EJB 以上内容一直有效,直到Java 1.7现在在Java 8中,我可以在接口中编写方法的实现,还可以使用在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
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扩展包含默认方法的接口时,可以执行以下操作
BaseImplClass实现接口
,因此,您可以选择在接口中定义这些默认实现,如果需要,可以覆盖这些实现现在,如果你想到可能发生的钻石问题(如果一个类使用相同的默认方法签名实现多个接口,我们将遇到不明确的情况。答案是否定的,在这种情况下,您将在编译时出错。您必须重写该方法。答案1:我确信默认方法提供了部分封装。因为当我们类内的p代码(现在可能在接口内)封装就在那里。它主要是一种当代的抽象方法,在这里我们可以提供我们想要做的事情,而不是我们想要如何做
回答2:这不是一个新问题,新手可以做比这更危险的事情。我认为我们可以设置检查样式来禁止这种方法。在接口中仍然不能有字段,所以不能有状态,这也意味着封装实际上与接口的更改无关。@LouisWasserman请详细说明我们在回答部分的评论或提供一些有用的链接,您所说的“封装实际上与接口的更改无关”,这将是有帮助的。谢谢..相关:“Java1.7,很高兴我使用接口实现OOPs概念封装”…奇怪的是,接口实际上与封装或数据隐藏没有任何直接关系。“在Java 8中,我们是否试图引入一种称为默认和静态方法的部分封装?”…默认方法是达到目的的一种手段:一种在不破坏数十年的现有代码的情况下发展遗留Java接口的方法。默认方法确实在Java中引入了更多的多重继承,特别是实现(或行为)的多重继承。Java仍然禁止状态的多重继承。“在许多应用程序中,我们需要一个基本实现类……因此,您可以选择在接口中定义这些默认实现,而不是拥有一个基本实现类"…我想指出的是,接口的框架、基础或抽象实现仍然是一种有用的设计。只有在可以仅使用接口方法调用实现的情况下,才存在使用默认方法的接口替换框架实现的选项。如果需要状态,则抽象类通常仍然存在正确的调用。“我确信默认方法提供了部分封装。因为当我们在类中封装代码时(现在可能在接口中),封装就在那里。主要是一种当代的抽象方法,在这里我们可以提供我们想要做的事,而不是我们想要如何做。”…我很确定我不知道这意味着什么。