Java 封装
封装是面向对象编程的关键特性之一。封装是指将字段和方法捆绑在单个类中。
它阻止外部类访问和修改类的字段和方法。这也有助于实现数据隐藏。
示例 1:Java 封装
class Area {
// fields to calculate area
int length;
int breadth;
// constructor to initialize values
Area(int length, int breadth) {
this.length = length;
this.breadth = breadth;
}
// method to calculate area
public void getArea() {
int area = length * breadth;
System.out.println("Area: " + area);
}
}
class Main {
public static void main(String[] args) {
// create object of Area
// pass value of length and breadth
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()
方法中应用了逻辑。现在,age 不能为负数。 - getter 和 setter 方法为我们的类字段提供了只读或只写访问。例如,
getName() // provides read-only access setName() // provides write-only access
- 它有助于解耦系统的组件。例如,我们可以将代码封装到多个模块中。
这些解耦的组件(模块)可以独立且并行地开发、测试和调试。并且,某个组件中的任何更改都不会对其他组件产生任何影响。 - 我们还可以使用封装来实现数据隐藏。在上面的示例中,如果我们把 length 和 breadth 变量改为 private,那么对这些字段的访问就会受到限制。
并且,它们会被隐藏起来,不被外部类访问。这就是数据隐藏。
数据隐藏
数据隐藏是一种通过隐藏实现细节来限制对数据成员的访问的方法。封装也提供了一种数据隐藏的方式。
我们可以使用访问修饰符来实现数据隐藏。例如,
示例 2:使用 private 说明符进行数据隐藏
class Person {
// private field
private int age;
// getter method
public int getAge() {
return age;
}
// setter method
public void setAge(int age) {
this.age = age;
}
}
class Main {
public static void main(String[] args) {
// create an object of Person
Person p1 = new Person();
// change age using setter
p1.setAge(24);
// access age using getter
System.out.println("My age is " + p1.getAge());
}
}
输出
My age is 24
在上面的示例中,我们有一个 private
字段 age。由于它是 private
,因此无法从类外部访问。
为了访问 age,我们使用了 public
方法:getAge()
和 setAge()
。这些方法称为 getter 和 setter 方法。
将 age 设置为 private 使我们能够限制从类外部的未经授权的访问。这就是数据隐藏。
如果我们尝试从 Main 类访问 age 字段,将会收到一个错误。
// error: age has private access in Person
p1.age = 24;