面试官: 什么是封装,如何在Java中实现封装?
我: 封装是一种机制,用于隐藏信息不让客户端直接访问。该信息可以是数据、实现或算法。我们使用访问修饰符来实现这个目的。
面试官: 这是数据隐藏。除了使用访问修饰符,还有哪些方法可用于在Java中实现封装?
我: 嗯...
具体问题: 除了“访问修饰符”之外,在Java中实现封装的方法有哪些?
面试官: 什么是封装,如何在Java中实现封装?
我: 封装是一种机制,用于隐藏信息不让客户端直接访问。该信息可以是数据、实现或算法。我们使用访问修饰符来实现这个目的。
面试官: 这是数据隐藏。除了使用访问修饰符,还有哪些方法可用于在Java中实现封装?
我: 嗯...
具体问题: 除了“访问修饰符”之外,在Java中实现封装的方法有哪些?
一般来说,封装 就是将类似的项目绑定在一起。
例如,我们有一个 Student
类,其中我们将学生实例变量和对这些实例变量进行操作的行为/方法放置在一个地方。
为什么这很重要呢?因为我们不想让我们的代码分散在整个代码库中。
如果我们需要做出更改,那么我们需要在所有位置找到这些更改的变体。通过捆绑类似的项目,我们只是避免了这种情况,并且它还有助于使我们捆绑的代码更加聚焦。
它提供了一种保护您的数据免受外部世界侵害的方式。这意味着,假设我将我的实例变量设置为公共属性,那么任何人都可以更改其状态。但是如果我们将我们的实例变量设置为私有/受保护的,则实际上我们正在限制外部实体对其进行更改。
现在问题是,在什么方面我们正在保护我们的变量?
再次说明,封装 只是我们需要将类似的项目放置的容器。
它就像一个 黑匣子 对外部世界。外部世界(我指使用我们的 Student
类的客户端/消费者)不知道 Student
类的内部详细信息/实现详细信息,实际上他们不应该关心类的内部详细信息/实现详细信息。他们只想要一些方法/API,以便他们可以在他们的客户端应用程序中使用它们。
因此,我的观点是,所有与学生有关的行为/变量都放置在一个我们称之为类的 黑匣子 中。现在由类的设计者决定对于外部世界而言哪些元素应该隐藏,哪些应该对外公开。
现在回到问题,在Java中:我们将变量私有化,这意味着它们是类受保护的。如果我们希望我们的实例变量在整个包中都可以访问,则它们是包受保护的。在整个项目中它们是公共的。所以我想说的是,要隐藏数据,您需要一些容器来放置您的数据并相对于容器进行隐藏。
因此,我认为数据隐藏没有封装就不可能实现。您不能隐藏数据而不将其放入某种容器中。再次提醒您,我正在将其放在面向对象语言的上下文中。
但是,是的,封装可以在不隐藏数据的情况下实现。将所有内容设为公共,并可以看到影响。
封装:以胶囊为例。如果你打开它,里面包含很多成分。面向对象编程的封装也是如此。正如其名称所示,“封装”意味着将所有数据成员、属性和相应方法封装在一个单一的胶囊内。
如何实现:假设你创建了一个名为“Car”的类。现在汽车有颜色、价格和型号,这些都是属性,它还有一个“run”方法。因此,你已经将命名为“Car”的车辆的所有这些属性和方法封装在一起。当你创建车的实例时,就像这样:
Car myCar = new Car();
你可以使用myCar变量访问Car的所有属性。数据隐藏意味着我们在类内提供对数据的安全保护。
抽象化是通过定义成员函数来隐藏代码。
封装是抽象化和数据隐藏的结合,意味着我们将数据及其相关代码包装起来。例如,bean类。
class student {
private int age; // Data Hiding
public setAge(){} // Abstraction
public getAge(){} // Abstraction
}
学生类被封装。
封装 = 数据隐藏 + 抽象化