Java 面向对象编程中的封装
封装是将数据(变量)和代码封装在一起作为一个单元的原则。它是四个面向对象编程的概念之一。其他三个是继承、多态和抽象。
什么是 Java 中的封装
要详细了解封装内容,请参考以下具有存款和查询余额方法的银行帐户类
class Account {
private int account_number;
private int account_balance;
public void show Data() {
//code to show data
}
public void deposit(int a) {
if (a < 0) {
//show error
} else
account_balance = account_balance + a;
}
}
假设黑客设法访问你的银行帐户代码。现在,他尝试通过两种方式将金额-100 存入你的帐户。让我们看看他的第一种方法。
**方法 1:**他试图通过操纵代码将无效金额(比如-100)存入你的银行账户。
class Hacker {
Account a = new Account();
a.account_balance = -100;
}
问题是 - 这可能吗?让我们来看一下。
通常,类中的变量设置为 private
,如下所示。它只能使用类中定义的方法访问。没有其他类或对象可以访问它们。
如果数据成员是私有的,则意味着它只能在同一个类中访问。没有外部类可以访问私有数据成员或其他类的变量。
因此,在我们的例子中,黑客无法向你的帐户存入-100 金额。
方法 2:黑客的第一种方法未能存入金额。接下来,他尝试使用 deposit
方法存入金额-100。
但是 deposit
方法中检查负值。所以第二种方法也失败了。
因此,你永远不会将你的数据暴露给外部方。这使你的应用程序安全。
整个代码可以被认为是一个封装,你只能通过消息进行通信。因此称之为封装。
Java 中的数据隐藏
通常,Java 封装被称为数据隐藏。但是,除了数据隐藏之外,封装概念还意味着更好地管理或分组相关数据。
要在 Java 中实现较低程度的封装,可以使用 protected
或 public
等修饰符。通过封装,开发人员可以轻松地更改代码的一部分而不会影响其他代码。
Java 中的 getter
和 setter
方法
如果数据成员被声明为 私有
,则只能在同一个类中访问它。没有外部类可以访问该类的数据成员。如果需要访问这些变量,则必须使用公共 getter
和 setter
方法。
getter
和 setter
的方法用于创建、修改、删除和查看变量值。
以下代码是 getter
和 setter
方法的示例:
class Account{
private int account_number;
private int account_balance;
//getter method
public int getBalance() {
return this.account_balance;
}
//setter method
public void setNumber(int num) {
this.account_number = num;
}
}
在上面的示例中,getBalance()
方法是读取变量 account_balance
的值的 getter
方法,setNumber()
方法是 setter
方法,用于设置或更新变量 account_number
的值。
抽象与封装
通常封装会被误解为抽象。我们来澄清下,
- 封装更多的是关于
如何
实现功能 - 抽象更多的是关于一个类可以做什么。
了解这种差异的一个简单例子是手机。将电路板中的复杂逻辑封装在触摸屏中,并提供接口以将其抽象出来。
Java 封装的优点
- 封装将数据与其相关功能绑定在一起。这里的功能意味着
方法
,数据意味着变量
- 所以我们将变量和方法保存在一个地方。那个地方是
类
。类是封装的基础。 - 使用 Java 封装,你可以隐藏(限制访问)代码中的关键数据成员,从而提高安全性。
- 正如我们前面所讨论的,如果数据成员被声明为
私有
,那么它只能在同一个类中访问。没有外部类可以访问其他类的数据成员(变量)。 - 但是,如果需要访问这些变量,则必须使用 public
getter
和setter
方法。