Java封装
封装是面向对象编程的关键功能之一。封装是指将字段和方法绑定在单个类中。
将类中的相似字段和方法捆绑在一起也有助于隐藏数据。
封装字段和方法
通常,封装是将类似代码包装在一个地方的过程。
在Java中,我们可以将在单个类中一起操作的字段和方法捆绑在一起。例如,
class Rectangle {
int length;
int breadth;
public void getArea() {}
}
在上面的程序中,方法getArea()
计算矩形的面积。要计算面积,需要长度和宽度 。因此,数据字段的长度 , 宽度和方法getArea()
一起保存在Rectangle类中。
Java数据隐藏
数据隐藏是一种通过隐藏实现细节来限制我们的数据成员访问的方法。
封装还提供了一种隐藏数据的方法。
可以通过访问修饰符来实现数据隐藏。在Java中,有四个访问修饰符:
- 公共 -随处可见
- 私人 -仅在班级内部可见
- 受保护 -在包中及其子类中可见
- 默认 -在包中可见
要了解更多信息,请访问Java Access修饰符。
示例1:使用私有数据隐藏
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("My age is " + p1.getAge());
}
}
输出
My age is 24
在上面的示例中,我们有一个private
字段age 。由于它是私有的,因此无法从类外部访问它。为了访问年龄 ,我们使用了public
方法getAge()
和setAge()
。这些方法称为getter和setter方法。
如果尝试从Main类访问age字段,则会收到错误消息。
p1.age = 24; // error: age has private access in Person
将年龄设为私人年龄可以使我们限制来自课堂之外的未经授权的访问。这是数据隐藏。
示例2:使用受保护的数据隐藏
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
领域职业和一个protected
方法displayInfo()
。
我们已经从Teacher类(这是Person的子类)中访问了这些成员。
为什么要封装?
- 在Java中,封装可帮助我们将相关的字段和方法保持在一起,从而使我们的代码更整洁且易于阅读。
- 它有助于控制我们数据字段的修改。考虑一种情况,我们希望班级中的年龄字段为非负数。在这里,我们可以将年龄
setAge()
private
并可以在setAge()
方法内部应用逻辑。例如,
class Person {
private int age;
public void setAge(int age) {
if (age >= 0) {
this.age = age;
}
}
}
- getter和setter方法提供对我们的类字段的只读或只写访问。例如,
getName() // provides read-only access
setName() // provides write-only access
- 它有助于解耦系统的组件。这些解耦的组件可以独立且同时进行开发,测试和调试。并且,特定组件的任何更改都不会对其他组件产生任何影响。
数据隐藏与封装形式
setAge()
private
并可以在setAge()
方法内部应用逻辑。例如, class Person {
private int age;
public void setAge(int age) {
if (age >= 0) {
this.age = age;
}
}
}
getName() // provides read-only access
setName() // provides write-only access
人们通常将封装视为数据隐藏,但这并非完全正确。
封装是指将相关领域和方法捆绑在一起。这使我们可以实现数据隐藏。封装本身并不是隐藏数据。