封装与数据隐藏 - Java

访问者:什么是封装,如何在Java中实现它?

我:封装是一种对客户端隐藏信息的机制。该信息可以是数据或实现或算法。我们使用访问修饰符来实现此目的。

访问者:这是数据隐藏。我们如何在Java中实现封装?

:嗯

具体问题:除了“Access Modifirs”之外,在Java中实现 Encapsulation 的方法是什么?


答案 1

更一般地说,封装仅指将数据(例如对象的数据)与该数据的操作捆绑在一起。因此,您有一个封装数据(字段)的类,以及用于操作该数据的方法

但是,封装有时也以与您的答案相同的方式使用,实际上,捆绑数据和方法的要点之一是隐藏实现。

我认为比仅仅使用方法并使所有字段私有更好的答案是:使用接口。这样,对对象的操作完全基于接口协定,并且绝不依赖于用于在内部实现该协定的字段或帮助器方法。


答案 2

封装

一般来说,封装意味着捆绑类似的项目,就这么简单。

例如,以一门课为例,我们将让学生在一个地方对这些实例变量进行实例变量和行为/方法的操作。Student

为什么它很重要?我们不希望我们的代码分散在我们的代码库中。

如果假设我们需要进行更改,那么我们需要在所有地方找到(该更改的变体)。通过捆绑类似的项目,我们只是避免了这种情况,这也有助于使我们的捆绑代码更加集中。

数据隐藏

它只是提供了一种保护数据免受外界影响的方法。这意味着,假设我将实例变量设置为公开,那么任何人都可以更改其状态。但是,如果我们将实例变量设置为私有/受保护,那么实际上我们正在限制外部实体对其进行更改。

比较/讨论

现在问题来了,我们在哪些方面保护我们的变量?

同样,我们需要了解封装只是我们需要放置类似物品的容器。

它只是像一个黑匣子对外界。外部世界(我的意思是说客户端/消费者:使用我们的类)不知道类的内部细节/实现细节,实际上他们不应该关心类的内部细节/实现细节。他们只需要一些方法/API,以便他们可以在客户端应用程序中使用它们。StudentStudent

所以我的观点是,所有与学生相关的行为/变量都放在一个黑匣子里,我们称之为一个类。现在由类的设计人员来决定类的哪些元素应该被隐藏,什么不应该被外界隐藏。

现在回到Java中的问题:我们将变量设为私有,这意味着它们受到类保护。如果我们希望我们的实例变量在整个包中可访问,那么它们就受到包保护。在整个项目中,他们是公开的。所以我想说的是,要隐藏数据,你需要某种容器,在那里你可以放置你的数据并相对于容器隐藏。

因此,我认为没有封装就无法进行数据隐藏。如果不将数据放入某种形式的容器中,就无法隐藏数据。我再次提醒你,我把它放在面向对象语言的上下文中。

但是,是的,封装是可能的,而无需隐藏您的数据。把所有的事情都公之于众,你可以看到影响。