有关于封装(Java)

54 阅读2分钟

Java 中的封装是一种面向对象编程的重要特性,可以将数据和方法封装在类中,并对外部隐藏实现细节。封装的目的在于保护数据的安全性和完整性,同时提高了代码的复用性和可维护性。

封装主要体现在以下几个方面:

  1. 将类的成员变量定义为 private,只能在类中访问,并提供 getter、setter 方法来访问和修改数据。这样可以有效保护数据的安全性,避免外部对数据进行非法的访问和修改。

例如,下面这个类就将 name 和 age 两个属性定义为 private,再分别提供了对应的 getter 和 setter 方法:

public class Person {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }
}

2. 对外提供一些公共方法,用来操作数据,这样就不会暴露内部实现的细节。这些公共方法可以是方法的参数和返回值,或者是对象的行为。

下面是一个简单的例子,其中定义了一个 Car 类,可以使用 start() 方法启动汽车:

public class Car {
   private boolean started = false;
  
   public void start() {
      if (!started) {
         // 启动汽车的代码
         started = true;
      }
   }
}

在汽车启动的时候,Car 类内部可以执行很多操作,如检查电池电量、判断机油温度、点火等,但这些细节并不需要外部知道,所以只需要将启动方法 public 化即可。

  1. 隐藏类的内部细节,只暴露必要的接口给外部使用。这样可以避免已经使用的类被修改而带来的代码风险和修改代价。

例如,下面这个类的内部实现使用了数组 arr 来存储数据,但是对外只提供了 add() 和 get() 方法,使用方只能通过这两个方法来操作数据,而不需要关心数据的具体存储实现:

public class MyList {
   private int[] arr = new int[10];
   private int size = 0;

   public void add(int elem) {
      if (size >= arr.length) {
         int[] newArr = new int[arr.length * 2];
         System.arraycopy(arr, 0, newArr, 0, arr.length);
         arr = newArr;
      }
      arr[size++] = elem;
   }

   public int get(int index) {
      if (index >= 0 && index < size) {
         return arr[index];
      }
      throw new IndexOutOfBoundsException();
   }
}

这样,使用方只需要调用 add() 和 get() 方法即可实现对数据的添加和获取,而不需要了解 MyList 类内部的实现细节。

总之,Java 的封装是一种重要的面向对象编程特性,可以将数据和方法封装在类中,保护数据的安全性和完整性,并提高代码的复用性和可维护性。通过使用 private 修饰成员变量、公共方法等,可以对外隐藏类的内部细节,只暴露必要的接口给外部使用。