【问题标题】:Core OOPS : Encapsulation核心面向对象:封装
【发布时间】:2021-01-22 03:14:16
【问题描述】:

昨天在一次采访中我被问到 封装在内部是如何工作的? 我真的很困惑,因为在我看来,封装很简单 "The state of a class should only be accessed through its public interface." 但是当谈到内部工作时,我已经说不出话了。所以,如果有人能解释一下,那会很有帮助。

【问题讨论】:

  • 你不能要求澄清一下吗?听起来是个愚蠢的问题。尽管真正的封装是尽可能多地隐藏数据,但公共接口暴露的每一位数据都会削弱封装。
  • 你应该向你的面试官询问更多细节。你必须有多“内部”——他是否希望你解释字节码细节?现在我们无法回答这个问题。
  • 我要求他进一步澄清这一点,但我猜他被冒犯了,没有回答我的问题。

标签: java oop encapsulation concept


【解决方案1】:

我同意评论者的观点,即要求澄清是个好主意 - 好问题甚至比好答案更好,并让您确保您实际上回答了他们认为他们在问的问题。

在这种情况下,我假设他们希望您解释 Java 如何确保程序员不违反封装。这涉及到

  • 用于将字段/方法标记为公共、私有、受保护或受包保护的内置语法和语义。
  • 编译器检查以确保不违反这些规定
  • (外部)工具可用于检测与封装相关的代码异味,例如从构造函数中调用可覆盖的方法。
  • (有点牵强)无法直接访问程序内存,例如,在 Java 中无法使用 C/C++ 中的重新解释转换;这也保留了封装性。

你可以通过询问 “你是指 Java 如何确保程序员不违反封装,也就是说,他们不会访问对象的状态,除非通过其公共接口?”

想到其他答案:

  • 使用有意义的 cmets,可通过 IDE 中的 JavaDoc 和可浏览的文档轻松访问,让程序员了解如何使用和组合类。
  • 强制封装的强大编码约定,例如将字段设置为尽可能限制访问,并且只公开那些实际上应该公开的部分。

【讨论】:

  • 最终我只回答了这个问题,java 如何通过使用访问修饰符和等等来处理封装,但他就像我想知道内部工作一样。所以我翻了很多博客,看书,最后决定把这个放在 stackoverflow 上找一些专家 cmets,结果我向他解释了封装是什么以及 java 如何确保它的实现。
  • 内部方面,您可以解释编译器的作用,即 Java 编译器生成包含字段、类和方法访问描述符的抽象语法树 (AST)(如果访问无效则生成错误)在编译时检测到),并且它们被进一步保存在字节码中以在运行时检查,尽管它们可以通过自省来修改
猜你喜欢
  • 1970-01-01
  • 2016-02-03
  • 2011-03-24
  • 2013-03-04
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多