Java 封装
提示
- 封装概念:封装是面向对象编程的核心特性,指将数据(字段)和操作数据的方法捆绑在一起的做法,实现了代码组织和结构化。
- 数据隐藏与封装:封装有助于实现数据隐藏,但不完全等同于数据隐藏。通过设置字段为私有(
private
)并通过公共方法(getters
和setters
)访问,可以实现数据隐藏。 - 封装的优势:封装提高了代码的可读性和维护性,有助于数据字段的值控制和解耦系统组件,同时支持只读或只写访问权限。
Java 封装
封装是面向对象编程的关键特性之一。封装指的是将字段和方法捆绑在单个类中。
它阻止外部类访问和更改类的字段和方法。这也有助于实现数据隐藏。
示例 1:Java 封装
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);
}
}
class Main {
public static void main(String[] args) {
// 创建 Area 对象
// 传递长度和宽度的值
Area rectangle = new Area(5, 6);
rectangle.getArea();
}
}
输出
面积: 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() // 提供只读访问
setName() // 提供只写访问
- 它有助于解耦系统的组件。例如,我们可以将代码封装到多个包中。 这些解耦的组件(包)可以独立并行地开发、测试和调试。而且,特定组件的任何更改都不会影响其他组件。
- 我们也可以使用封装来实现数据隐藏。在 上面的例子中,如果我们将 length 和 breadth 变量改为 private,那么对这些字段的访问就会受到限制。 它们被隐藏在外部类之外。这就是所谓的数据隐藏。
数据隐藏
数据隐藏是一种通过隐藏实现细节来限制我们的数据成员访问的方式。封装也提供了数据隐藏的方法。
我们可以使用 访问修饰符 来实现数据隐藏。例如,
示例 2:使用 private 限定符实现数据隐藏
class Person {
// 私有字段
private int age;
// getter 方法
public int getAge() {
return age;
}
// setter 方法
public void setAge(int age) {
this.age = age;
}
}
class Main {
public static void main(String[] args) {
// 创建 Person 对象
Person p1 = new Person();
// 使用 setter 更改年龄
p1.setAge(24);
// 使用 getter 访问年龄
System.out.println("我的年龄是 " + p1.getAge());
}
}
输出
我的年龄是 24
在上述示例中,我们有一个 private
字段 age
。由于它是 private
的,所以不能从类外部访问。
为了访问 age
,我们使用了 public
方法:getAge()
和 setAge()
。这些方法被称为 getter 和 setter 方法。
将 age
设为 private 让我们能够限制从类外部的未授权访问。这就是数据隐藏。
如果我们尝试从 Main
类访问 age
字段,我们将会得到一个错误。
// 错误:age 在 Person 中具有私有访问权限
p1.age = 24;