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;