当单独"final"已经阻止修改变量时,为什么要使用 "private + final"?

  • 本文关键字:final private 单独 变量 修改 java
  • 更新时间 :
  • 英文 :


我看到了很多像private final int variable;这样的变量声明

我想知道我们是否可以安全地将private更改为public

我认为我们使用private的主要原因是防止变量被其他类修改,但这里的final关键字已经阻止了任何类型的修改。

所以我想答案是肯定的?

Private不仅仅是不能更改值,它甚至不能从外部看到它。它是其他类不应该依赖的值,要么是因为它是一个实现细节,要么是由于它不是类公开它的接口的永久部分。通过将其设为私有,其他类将无法引用它,并且在值更改或完全消失时也不会断开。

封装。

通过用private定义修饰符,可以防止类外的代码访问数据。

如果希望访问类之外的数据,则必须定义一个关于如何访问数据的公共方法。

编辑:我想你想知道我们为什么要使用private修饰符。

这是有意见的,但这就是为什么在大多数情况下我们想要实现Encapsulation。想象一下,你在一个类中写了一组逻辑。

public class MyClass {
private final String MyAttribute;
public MyClass() {
// logic. / initialize the MyAttribute
}
public String getMyAttribute() {
return this.MyAttribute;
}
public void setMyAttribute() {
// logic.
}
}

显然,您不希望其他代码扰乱您的逻辑。否则,可能导致:1。安全漏洞,2。Bugs。这就是使用private修饰符的原因。为了实现encapsulation/您定义了其他代码如何与您的类交互(如何获取数据,如何修改数据(。

我想从前面的答案中添加更多细节。

private是可访问性。类外不能"参见";
final是一个固定值的声明。没有什么能改变它,无论是在课堂内外。

所以private final是:

  1. 确保变量被隐藏在外部
  2. 变量具有固定值

简而言之,答案是private关键字是访问修饰符的一个示例,它控制该变量是否对其他类可见。我们制作了一个变量private,使该变量对其他类隐藏,并且不能在其定义的类之外读取或修改。

考虑以下示例:

/* Person.java */
public class Person {
private int bankBalance = 1000;      // Private member
}
/* Hacker.java */
public class Hacker {
public static void main(String[] args) {
Person Tom = new Person();
int tomMoney = Tom.bankBalance;  // ERROR!
}
}

Person类中,我们将成员变量bankBalance设置为private。这意味着bankBalance只能在Person类中访问(即可读和可修改(。因此,如果我们尝试在Hacker类中执行int tomMoney = Tom.bankBalance;,则会出现一个错误,称为The field Person.bankBalance is not visible。由于bankBalanceHacker类已经不可见,这意味着其他类不能修改此变量。

如果我们以不同的方式定义bankBalance变量,则会出现以下行为:

+-------------------------------+-----------------------+-----------------------+
|                               |    Within "Person"    |    Outside "Person"   |
|                               +----------+------------+----------+------------+
|                               | Readable | Modifiable | Readable | Modifiable |
+-------------------------------+----------+------------+----------+------------+
| private int bankBalance       |    Yes   |     Yes    |    No    |     No     |
+-------------------------------+----------+------------+----------+------------+
| private final int bankBalance |    Yes   |     No     |    No    |     No     |
+-------------------------------+----------+------------+----------+------------+
| public int bankBalance        |    Yes   |     Yes    |    Yes   |     Yes    |
+-------------------------------+----------+------------+----------+------------+
| public final int bankBalance  |    Yes   |     No     |    Yes   |     No     |
+-------------------------------+----------+------------+----------+------------+
  • 如果bankBalance是私有的,那么它在Person类之外是不可见的。因此,它不能在Person之外可读和可修改
  • 如果bankBalance是最终变量,则无论该变量是在Person内部还是外部访问,都不能修改

最新更新