Java 菜鸟教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java 封装

在本教程中,您将借助示例学习Java中的封装和数据隐藏。

Java 封装

封装是面向对象编程的重要功能之一。封装是指将字段和方法绑定在单个类中。

将类中的类似字段和方法捆绑在一起也有助于隐藏数据。

封装字段和方法

通常,封装是将类似代码包装在一个地方的过程。

在Java中,我们可以将在单个类中一起操作的字段和方法捆绑在一起。例如,

class Rectangle {
   int length;
   int breadth;
   public void getArea() {}
}

在上面的程序中,getArea()方法计算矩形的面积。为了计算面积,它需要长度(length)和宽度(breadth)。因此,数据字段length、breadth和方法getArea()被放在Rectangle类中。

Java 数据隐藏

数据隐藏是一种通过隐藏实现细节来限制数据成员访问的方法。

封装还提供了一种隐藏数据的方法。

数据隐藏可以通过访问修饰符来实现。在Java中,有四个访问修饰符:

  • public - 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的

  • private - 修饰的属性或方法是私有的,不能在声明它的类的外部访问

  • protected - 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的

  • default - 即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。

要了解更多信息,请访问Java 修饰符

示例1:使用 private 数据隐藏

class Person {
   private int age;

   public int getAge() {
      return age;
   }

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

class Main {
   public static void main(String[] args) {
      Person p1 = new Person();
      p1.setAge(24);
      System.out.println("我的年龄是 " + p1.getAge());
   }
}

输出结果

我的年龄是 24

在上面的实例中,我们有一个private字段age。因为它是私有的,所以不能从类外部访问它。为了访问age,我们使用了公共方法getAge()和setAge()。这些方法称为getter和setter方法。

如果尝试从Main类中访问age字段,则会出现错误消息。

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

将age设置为私有,可以限制来自类外部未经授权的访问。这是数据隐藏。

示例2:使用 protected 数据隐藏

class Person {
 protected String profession;

 protected void displayInfo() {
   System.out.println("I am a " + profession);
 }
}

class Teacher extends Person {
   public static void main(String[] args) {
      Teacher t1 = new Teacher();
      t1.profession = "teacher";
      t1.displayInfo();
   }

}

输出结果

I am a teacher

在上面的程序中,我们创建了一个Person类,其中包含protected字段 profession 和protected方法displayInfo()。

我们已经从Teacher类(Person的子类)访问了这些成员。

为什么要封装?

  • 在Java中,封装可帮助我们将相关的字段和方法保持在一起,从而使我们的代码更整洁且易于阅读。

  • 它有助于控制我们数据字段的修改。 考虑一种情况,我们希望类中的age字段为非负数。 在这里,我们可以将age设为私有,并可以在setAge()方法内部应用逻辑。 例如,

class Person {
   private int age;

   public void setAge(int age) {
     if (age >= 0) {
        this.age = age;
     }
   }
}
  • getter和setter方法提供对我们的类字段的只读或只写访问。例如,

getName()   // 提供只读访问
setName()   //提供只写访问
  • 它有助于解耦系统的组件。这些解耦的组件可以独立且同时进行开发,测试和调试。并且,特定组件的任何更改都不会对其他组件产生任何影响。

数据隐藏 与 封装

人们通常认为封装是数据隐藏,但这并不完全正确。

封装是指将相关字段和方法捆绑在一起。这使得我们能够实现数据隐藏。封装本身并不是数据隐藏。