JavaRush /Java 博客 /Random-ZH /Java中的封装原则

Java中的封装原则

已在 Random-ZH 群组中发布
你好!今天的讲座将专门讨论封装,我们将立即通过示例开始:)在您面前的是一台熟悉的汽水机。我有一个问题要问你:它是如何运作的?尝试详细回答:玻璃杯来自哪里,内部温度如何保持,冰块存放在哪里,机器如何理解要添加什么糖浆等。最有可能的是,您没有这些问题的答案。好吧,也许不是每个人都使用这样的机器;它们现在不那么流行了。让我们尝试举另一个例子。你知道你每天都会使用很多次的东西。哦,我有一个主意! 封装原则 - 2 告诉我们Google 搜索引擎是如何工作的。它到底是如何根据您输入的单词搜索信息的?为什么这些结果位于顶部而不是其他结果?尽管您每天都使用 Google,但您可能并不知道。但这并不重要。毕竟,你不需要知道这一点。 您可以在搜索引擎中输入查询,而无需考虑它到底是如何工作的。您可以从自动售货机购买苏打水,而不知道它是如何工作的。即使在学校水平,你也可以在不深入研究内燃机操作、甚至不了解物理的情况下驾驶汽车。这一切之所以成为可能,要归功于面向对象编程的主要原则之一——封装。在阅读有关该主题的各种文章时,您可能会发现编程中有两个常见概念 -封装隐藏。作者所说的“封装”这个词有这样或那样的意思(正如它所发生的那样)。我们将分解这两个术语,以便您有一个完整的理解。编程中“封装”一词的原始含义是将数据和使用该数据的方法组合在一个包(“胶囊”)中。在Java中,类充当胶囊包。类包含数据(类字段)和处理该数据的 方法。封装原则 - 3 这对您来说似乎是显而易见的,但在其他编程概念中,一切的工作方式都不同。例如,在函数式编程中,数据与其操作严格分离。在 OOP(面向对象编程)中,程序由胶囊类组成,胶囊类既是数据也是使用它的函数。现在我们来谈谈隐藏。我们如何使用各种复杂的机制而不了解它们如何工作以及它们的工作基于什么?很简单:它们的创建者提供了一个简单且用户友好的界面。在汽水机上,界面是面板上的按钮。只需按一个按钮,即可选择玻璃杯的体积。按第二个按钮即可选择糖浆。第三个负责加冰。这就是您所要做的。机器内部设计得如何精确并不重要。最重要的是,它的设计方式是用户需要按三个按钮才能获得苏打水。汽车也是如此。他内心发生什么并不重要。最主要的是,当你踩右踏板时,汽车前进,当你踩左踏板时,汽车减速。这正是隐藏的本质。程序的所有“内部”对用户都是隐藏的。对于他来说,这些信息是多余的,也是不必要的。用户需要的是最终结果,而不是内部过程。让我们以该类为例Auto
public class Auto {

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.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;

}
在这种情况下,您可以密切监视您的一位同事是否正在创建具有错误状态的对象,但最好排除创建此类“错误对象”的可能性。 封装原则 - 4 它们帮助我们隐藏数据:
  1. 访问修饰符(privateprotectedpackage default);
  2. getter 和 setter。
例如,我们可以检查是否有人试图将负数分配给猫作为它的年龄。正如我们前面所说,各种关于封装的文章的作者的意思要么是封装(将数据和方法结合起来),要么是隐藏,或者两者兼而有之。Java 具有这两种机制(其他 OOP 语言不一定如此),因此后一种选择是最正确的。使用封装给我们带来了几个重要的优势:
  1. 监视对象的正确状态。上面有这样的例子:借助 setter 和 private 修饰符,我们保护了我们的程序免受权重为 0 的猫的侵害。

  2. 界面的用户友好性。我们仅将方法保留在“外部”以供用户访问。他只需要给他们打电话就可以得到结果,根本不需要深究他们的工作细节。

  3. 代码的更改不会影响用户。我们在方法内部进行所有更改。这不会影响用户:他为汽车的汽油写了auto.gas(),所以他会写它。事实上,我们在 Gas() 方法的操作中更改了某些内容,他仍然看不到:他和以前一样,只会收到所需的结果。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION