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