Java 封装

封装是面向对象编程的关键特性之一。在本教程中,我们将通过示例学习 Java 中的封装和数据隐藏。

在本教程中,我们将通过示例学习 Java 中的封装和数据隐藏。

Java 封装

封装是面向对象编程的关键特性之一。封装是指将字段和方法捆绑在单个类中。

它防止外部类访问和更改类的字段和方法。这也有助于实现数据隐藏

示例 1:Java 封装

public class Area {

  // 计算面积相关的字段
  int length; // 长度
  int breadth; // 宽度

  // 构造方法
  Area(int length, int breadth) {
    this.length = length;
    this.breadth = breadth;
  }

  // 计算面积方法
  public void getArea() {
    int area = length * breadth;
    System.out.println("Area: " + area);
  }
}

public class Main {
  public static void main(String[] args) {

    Area rectangle = new Area(5, 6);
    rectangle.getArea();
  }
}

输出

Area: 30

在上面的例子中,我们创建了一个 Area 类,这个类的主要目的是计算面积。

要计算面积,我们需要 length (长度), breadth (宽度) 两个变量以及一个 getArea() 方法。现在,我们将这些字段和方法捆绑在一个类中。

这只是封装,封装就是将类似的代码放在一起。在本例中,由于字段和方法可以从其他类访问。因此这不是数据隐藏

! 注意:人们通常将封装视为数据隐藏,但这并不完全正确。封装是指将相关的字段和方法捆绑在一起。这可以用来实现数据隐藏。封装本身并不是数据隐藏。

为什么要封装?

  • 在 Java 中,封装帮助我们将相关的字段和方法保持在一起,这使我们的代码更清晰易读。

  • 它有助于控制我们数据字段的值。例如,

    class Person {
      private int age;
    
      public void setAge(int age) {
        if (age >= 0) {
          this.age = age;
        }
      }
    }
    

    在这里,我们将 age 变量设置为私有(private)属性, 并在 setAge() 方法内部应用了逻辑:年龄不能为负。

  • getter 和 setter 方法提供对我们类字段的读写访问。例如,

    getName() // 读操作
    setName() // 写操作
    
  • 它有助于解耦系统的组件。例如,我们可以将代码封装到多个包中。

    这些解耦的组件(包)可以独立和同时进行开发、测试和调试。而且,特定组件的任何更改都不会对其他组件产生任何影响。

  • 我们也可以通过封装来实现数据隐藏。在上面的例子中,如果我们将长度和宽度属性更改为私有,那么对这些字段的访问将受到限制。

    并且,它们对外部类是不可见的,这称为数据隐藏

数据隐藏

数据隐藏就是对类/组件的使用者隐藏其中的实现细节。封装可以帮助我们实现数据隐藏。我们将属性和方法都放在类的内部,并使用访问修饰符来实现数据隐藏。例如,

示例 2:使用 private 隐藏数据

public class Person {

  // 私有属性
  private int age;

  // getter
  public int getAge() {
    return age;
  }

  // setter
  public void setAge(int age) {
    this.age = age;
  }
}

public class Main {
  public static void main(String[] args) {

    Person p1 = new Person();

    // 使用 setter 写入字段值
    p1.setAge(24);

    // 使用 getter 读取字段值
    System.out.println("My age is " + p1.getAge());
  }
}

输出

"My age is 24

在上面的例子中,我们有一个私有(private)字段年龄,它不能再类外部被访问。

为了访问年龄,我们使用了 getAge()setAge() 两个 public 方法。这些方法称为 getter 和 setter 方法。

由于类外部不能访问到类的私有属性,这就相当于将类的私有属性隐藏了起来,这就是数据隐藏

如果我们尝试访问类的私有属性,编译器会返回一个编译错误。

// error: age has private access in Person
p1.age = 24;