Java 界面如何帮助隐藏细节

Java 界面如何帮助隐藏细节,java,Java,我正在使用Java从 在为什么以及何时使用接口?中,他们提到 1) 为了实现安全性-隐藏某些细节,只显示对象(接口)的重要细节 但我无法理解接口如何帮助隐藏细节或安全性 在他们对接口的注释中,他们有以下几点 默认情况下,接口方法是抽象的和公共的 接口属性默认为public、static和final 根据我对接口的理解,它看起来更像是有助于减少代码中的错误数量,因为 接口方法没有主体-主体由“实现”类提供 在实现接口时,必须重写其所有方法 因此,我们声明了所有方法及其可访问性、返回类型和名

我正在使用Java从

为什么以及何时使用接口?中,他们提到

1) 为了实现安全性-隐藏某些细节,只显示对象(接口)的重要细节

但我无法理解接口如何帮助隐藏细节或安全性

在他们对接口的注释中,他们有以下几点

  • 默认情况下,接口方法是抽象的和公共的
  • 接口属性默认为public、static和final
根据我对接口的理解,它看起来更像是有助于减少代码中的错误数量,因为

  • 接口方法没有主体-主体由“实现”类提供
  • 在实现接口时,必须重写其所有方法
因此,我们声明了所有方法及其可访问性、返回类型和名称,当我们实现这些方法时,如果我们忘记创建一个没有在接口中声明的方法,它将抛出一个错误

有人能帮助我理解接口在安全性中的关系吗

1) 要实现安全性,请隐藏某些详细信息并仅显示 对象(接口)的重要细节

接口只包含那些必须由其实现的具体类实现的方法(从Java8开始省略默认方法)

比如说,

interface StudentOps {
    void insert(Student);
    void delete(Student);
    void update(Student);
}
class JdbcStudentOpsImpl implements StudentOps {
    public void insert(Student s) {
       // code
    }
    public void delete(Student s) {
       // code
    }
    public void update(Student s) {
       // code
    }

    public void validate(Student s) {
       // code
    }
}
StudentOps studentOps = Factory.createFor("JDBC");
StudentOps studentOps = Factory.createFor("Kafka");
在上面的
StudentOps
是一个接口,它只包含3种方法
insert
update
delete
。例如,当我们在不知道底层impl的情况下创建对象时

interface StudentOps {
    void insert(Student);
    void delete(Student);
    void update(Student);
}
class JdbcStudentOpsImpl implements StudentOps {
    public void insert(Student s) {
       // code
    }
    public void delete(Student s) {
       // code
    }
    public void update(Student s) {
       // code
    }

    public void validate(Student s) {
       // code
    }
}
StudentOps studentOps = Factory.createFor("JDBC");
StudentOps studentOps = Factory.createFor("Kafka");
我们无法访问
validate()
方法,对于那些不知道
JdbcStudentOpsImpl
类的人来说,该方法可能是隐藏的

考虑到有两种实现,一种是通过JDBC将数据存储到数据库中,另一种是将其推送到Kafka

这些实现可能在运行时提供,而实际程序员的工作是不担心数据存储在哪里的实现,而只是基于运行时参数(如JDBC、Kafka等)调用相应的操作

JdbcStudentOpsImpl
KafkaStudentOpsImpl
可以位于不同的jar(库)中,例如,这些jar(库)应该在运行时包含在类路径中

在这种情况下,调用
Factory.createFor()
的程序员可能不知道这些类。因此,除了
StudentOps
中的方法外,他不知道这些类中还有什么其他方法。他只是得到了一个可以访问的接口,他只需要关注接口中定义的那些方法


因此,根据示例,
insert()
update()
delete()
是重要的细节,而as
validate()
则不是。

没有接口不会减少代码中的错误数。接口是一个类承诺遵守的契约,如果它签署了契约,也就是说它实现了interface@JoakimDanielson接口是一个类承诺遵守的契约,如果它签署了契约,也就是说,它实现了接口,如果它
接口a
有一些方法
公共无效doSomething()
并且
类ABC实现了一个
但没有该方法
doSomething()
?那么会发生什么?就像如果我们不重写所有的方法会发生什么一样?@JoakimDanielson还有关于安全性的事情吗?@Hardik一个具体的类必须实现从接口或抽象超类继承的所有抽象方法。编译器强制执行此操作。如果不实现方法,则会出现编译错误,但这与在设计中使用接口的原因无关