你好!我们将在今天的课程中专门介绍 Java 封装,并从门外的示例开始:) 这里有一个普通的汽水自动售货机。我有一个问题要问你:它是如何运作的?尽量给出一个详细的答案:汽水从哪里来?内部温度如何保持?冰储存在哪里?机器如何知道要添加哪种糖浆?你可能没有这些问题的答案。好吧,也许不是每个人都使用这些机器。它们目前并不那么受欢迎。让我们试试另一个例子。您每天肯定会多次使用的东西。哦,我有个主意! 告诉我Google 搜索引擎如何作品。它究竟如何搜索有关您输入的字词的信息?为什么这些结果排在首位而不是其他?即使您每天都使用 Google,您也可能不知道。但这没关系。毕竟,这不是您需要知道的事情。您可以使用搜索引擎而无需考虑其具体工作原理。您可以从一台机器上购买苏打水,而不知道它是如何制造的。您无需深入研究内燃机的工作原理,甚至无需了解高中物理就可以驾驶汽车。由于面向对象编程的主要原则之一:封装,这一切都是可能的。在阅读有关该主题的不同文章时,您一定遇到过两个广泛使用的编程概念:封装和信息隐藏。碰巧,不同的人理解“ 封装'意味着不同的东西。我们将破译这两个术语,以便您有一个完整的理解。在编程中,封装是将数据和处理该数据的方法组合在一个包(“胶囊”)中。在Java中,封装包就是类。该类包含数据(字段)和处理该数据的 方法。这对您来说似乎是显而易见的,但在其他编程范例中一切都以不同的方式安排。例如,在函数式编程中,数据与数据操作是严格分开的。在面向对象编程 (OOP) 中,程序由胶囊(类)组成,胶囊(类)由数据和处理数据的函数组成。
现在让我们谈谈信息隐藏
我们如何在不了解它们是如何构建或如何工作的情况下使用各种复杂的机制?很简单:它们的创建者提供了简单方便的界面。在汽水机上,界面是前面板上的按钮。一键让您选择罩杯尺寸。您可以使用第二个按钮选择糖浆。第三个负责加冰。这就是您需要做的全部。机器内部的外观并不重要。重要的是,它的设计让用户只需按三个按钮就可以获得苏打水。同样的事情也适用于汽车。里面发生了什么并不重要。重要的是,当您踩下右踏板时,汽车会前进,而当您踩下左踏板时,汽车会减速。这就是信息隐藏的本质。一个程序的全部' s“内脏”对用户是隐藏的。这样的信息对于用户来说是多余的或不必要的。用户需要最终结果,而不是内部过程。例如,让我们看一下车辆类别:
public class Vehicle {
public void gas() {
/* Some complicated things happen inside a car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside a car.
As a result, it slows down */
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
// How everything looks to the user
// Press one pedal, the car moves
vehicle.gas();
// Press the other pedal, the car brakes
vehicle.brake();
}
}
这就是实现隐藏在 Java 程序中的方式。就像在现实生活中一样:为用户提供了一个接口(方法)。在程序中,如果您需要汽车来执行某个动作,您只需调用所需的方法即可。这些方法内部发生的事情是多余的。重要的是一切正常。这里我们一直在谈论实现隐藏。Java也有数据隐藏。我们在有关 getter 和 setter 的课程中写过它,但提醒一下也无妨。例如,我们有一个Cat类:
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Meow!");
}
}
也许你还记得上一节课这门课的问题是什么?如果没有,让我们回忆一下。问题是它的数据(字段)对所有人开放。另一个程序员可以轻松地创建一只体重为 0、年龄为 -1000 岁的无名猫:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
在这种情况下,您可以仔细跟踪您的一位同事是否正在创建具有无效状态的对象,但最好甚至消除创建这些无效对象的可能性。 我们借助以下方法实现数据隐藏:
- 访问修饰符(private、protected、package default);
- 吸气剂和吸气剂。
封装给了我们几个重要的优势:
- 监视正确的对象状态。我们在上面给出了这样的例子:感谢 setter 和private修饰符,我们已经保护我们的程序免受权重为 0 的猫的攻击。
- 用户友好的界面。我们只将方法暴露给用户。用户只需调用它们即可获得结果。并且没有必要深入研究它们如何工作的细节。
- 代码更改不会影响用户。我们在方法内部进行所有更改。这不会影响用户:他们编写了vehicle.gas()来施加气体,这就是他们将继续做的事情。事实上,我们在gas()方法内部进行了一些更改,这仍然是不可见的:和以前一样,它们只是获得了所需的结果。
更多阅读: |
---|
GO TO FULL VERSION