当前位置: 首页 > 知识库问答 >
问题:

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

乜安志
2023-03-14

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

在Java1.7之前,上面的都是有效的,现在在Java8中,我可以用defaultstatice关键字在接口中编写方法的实现,例如:

public interface Foo {

    public abstract int someUnimplementedMethod();

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

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

}

这在Java1.8中是完全有效的。

现在我的问题是:

顺便说一句,我读过Java文档,其中指出:

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

共有1个答案

商品
2023-03-14

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

就像你说的,它是正确的--可以有一个默认的和静态的(仅对接口可用,不能被覆盖。)

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

    null

所以我不知道该怎么称呼它(部分封装与否),它们是默认的实现,可以被覆盖。隐藏实际实现仍然是这里的一个特性。

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

>

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

    如果您有任何帮助器或实用工具类,您可以在接口...中使用静态方法,这些方法是公共的、最终的,并且不能被重写

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

  •  类似资料:
    • 如果是这样,那怎么可能是封装呢?变量仍然是公共的。将其声明为private将迫使我创建一个setter和getter来获取变量,因为private可见性修饰符。 我将其与Java进行比较,后者通常将成员变量作为private以及每个成员变量的public setter和getter。

    • 封装的概念:如果我们可以间接改变私有变量的值(通过setters和getters),那么私有变量是如何安全的,它是如何隐藏的?有人能详细解释一下吗...

    • 问题内容: 美好的一天! 我正在阅读一本有关封装的Java书,其中提到了getter和setter方法。 我读过要隐藏属性,我必须将实例变量标记为 “ PRIVATE” ,并设置 “ PUBLIC” 方法来访问数据。因此,我尝试制作类似但并非常规的代码,如下所示: 上面的代码是否因为我直接分配变量而公开了变量?我该如何做得更好?如果改用常规方法并在另一个类上分配值会更好吗?“隐藏数据”是什么意思?

    • Win32环境下动态链接库(DLL)编程原理 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间

    • 密封类用来限制类的继承关系,这意味着密封类的子类数量是固定的。看起来就像是枚举那样,当你想在一个密封类的子类中寻找一个指定的类的时候,你可以事先知道所有的子类。不同之处在于枚举的实例是唯一的,而密封类可以有很多实例,它们可以有不同的状态。 我们可以实现,比如类似Scala中的Option类:这种类型可以防止null的使用,当对象包含一个值时返回Some类,当对象为空时则返回None: sealed

    • 我不明白,HostDistance概念意味着它有本地或远程价值。需要在使用java API创建连接(即池选项中的core/max)时进行设置。 问题是 我们是否需要为集群中的每个节点设置主机距离值?如果是怎样? 或者 我读了这些链接 https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/policies/Loa