为什么我们在Java中声明私有变量?
Why do we declare Private variables in Java?
我很困惑,因为我一直听到的是 Java 中的私有变量应该保护代码或变量。但是如果任何人都可以访问代码,那么它是否是私有的就没有区别,他们仍然可以更改它。那么,当有权访问代码的任何人都可以更改它时,它如何被视为受到保护?
Public = 可与其他 Class
私有 = 其他人无法访问 Class
So if you have a private variable, it will not be accesible with other Class
why are variables private in java
实现封装,无法在class外访问。这并不意味着程序员不能更改源代码。
当程序员谈论访问变量时,他们指的是在程序运行时访问它的值。保护代码免受更改完全是另一回事,需要人工处理而不是编程语言的语法。在代码运行时将变量私有 "protects" 作为其值。在这个级别,我们不关心保护它免受其他程序员更改代码本身的影响。 so-called "data hiding" 的要点是对使用 class 的其他 class 隐藏内部数据。那些其他 classes 应该只通过调用 class 上的方法来访问行为,而不是通过直接更改变量的值。
遵循 "data hiding" 等一般编程原则,以帮助我们作为程序员编写正确的代码。如果任何 class 都可以改变一个变量的值,那么很难保证这个值是有效的。例如,您有一个变量,用于计算工厂生产的小部件数量。通过使变量成为私有数据成员,您可以更轻松地确保该值永远不会为负。另一方面,如果变量是 public,另一个 class 可以将其更改为负值,这会导致代码的其他部分崩溃。
变量是私有的,以保护对象的状态 - 在 object-oriented 编程术语中,这称为 encapsulation。
这是一个非常简单的例子。想象一下,我们有一个人 class,一个人的年龄是根据他们出生的年份计算的。
class Person {
private int yearOfBirth;
private int age;
public Person(int yearOfBirth) {
this.yearOfBirth = yearOfBirth;
this.age = Calendar.getInstance().get(Calendar.YEAR) - yearOfBirth;
}
public int getAge() {
return age;
}
}
在另一个 class 的某个地方,我们有这个......如果年龄是 public,我们真的可以通过更改它而不更新出生年份来搞乱我们的对象的状态。
public static void main(String[] args) {
Person bob = new Person(2000);
System.out.println("Bob's age: " + bob.getAge());
bob.age = 100; //This would be BAD!
}
通过封装 age 变量,可以防止意外更改,我们的 class 可以管理自己的状态。任何使用我们的 class 的人都不必关心计算一个人的年龄,因为它封装在我们的 class.
中
"Private" 变量表示 "controlled" 访问而不是 "no" 访问。例如我可以通过只有 getter 方法而没有 setter 方法来创建变量 read-only。所有者 class 决定提供给变量的访问权限 - 通过它向 public.
公开的方法
我还可以在存储值之前验证它并拒绝不允许的值。我还可以记录对值的更改。
它还可以同步多个变量,使它们都处于一致的状态,例如同时进行借记和贷记。
而且不 - 其他人不能更改我的代码,例如,如果我提供我的代码作为编译的 "jar" 文件。或者,如果他们更改了它并破坏了它——他们拥有它(即对他们的代码更改造成的后果负责)。
现实生活中的类比是室友通过共享钱包分担费用。如果钱包是 public - 任何人都可以从钱包里拿钱 - 没有责任。但是假设其中一个室友(拥有 class)拥有钱包(私有变量)- 并提供一个 "getter"(你要钱,我会从共享钱包给你)来访问钱包 - 有更多的责任。再也没有人会毫不犹豫地从钱包里拿钱了。然后钱包的管理员可以记录对它的所有访问 - 以防出现错误(争议) - 以解决问题。类似地,"addToWallet" 方法(室友贡献钱包)可用于将钱添加到钱包 - 与任何室友添加的开放钱包相比,它具有更多的责任感
/ 随意取钱。
数据Hiding/Encapsulation:
数据隐藏与抽象不同。不要将一个与另一个混淆。
Abstraction is hiding the code implementation from other Object/user
whereas Data hiding is achieved by Encapsulation via POJO classes.
Data hiding has to do with the instance variables which decides the
state of the Object. Hiding its content using the setter() and
Getter() methods is Data Hiding/ Encapsulation.
您可能想知道,getter() 方法如何隐藏数据,而它只是 returns 我们请求的数据,但关于 getter/setter 方法有一个不为人知的故事。
例子: 参考下面代码中的getName()方法
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
// can restrict the code without displaying data to user
if(condition)//restricted user check
return null;//returning null because the user is not supposed to view the data
return name;
}
}
这只有在访问修饰符是私有的情况下才有可能,因为如果它们是 public 或其他我们可以通过对象直接访问它们。如果它是私有的,只有这样你才能限制你的代码。
我很困惑,因为我一直听到的是 Java 中的私有变量应该保护代码或变量。但是如果任何人都可以访问代码,那么它是否是私有的就没有区别,他们仍然可以更改它。那么,当有权访问代码的任何人都可以更改它时,它如何被视为受到保护?
Public = 可与其他 Class
私有 = 其他人无法访问 Class
So if you have a private variable, it will not be accesible with other Class
why are variables private in java
实现封装,无法在class外访问。这并不意味着程序员不能更改源代码。
当程序员谈论访问变量时,他们指的是在程序运行时访问它的值。保护代码免受更改完全是另一回事,需要人工处理而不是编程语言的语法。在代码运行时将变量私有 "protects" 作为其值。在这个级别,我们不关心保护它免受其他程序员更改代码本身的影响。 so-called "data hiding" 的要点是对使用 class 的其他 class 隐藏内部数据。那些其他 classes 应该只通过调用 class 上的方法来访问行为,而不是通过直接更改变量的值。
遵循 "data hiding" 等一般编程原则,以帮助我们作为程序员编写正确的代码。如果任何 class 都可以改变一个变量的值,那么很难保证这个值是有效的。例如,您有一个变量,用于计算工厂生产的小部件数量。通过使变量成为私有数据成员,您可以更轻松地确保该值永远不会为负。另一方面,如果变量是 public,另一个 class 可以将其更改为负值,这会导致代码的其他部分崩溃。
变量是私有的,以保护对象的状态 - 在 object-oriented 编程术语中,这称为 encapsulation。
这是一个非常简单的例子。想象一下,我们有一个人 class,一个人的年龄是根据他们出生的年份计算的。
class Person {
private int yearOfBirth;
private int age;
public Person(int yearOfBirth) {
this.yearOfBirth = yearOfBirth;
this.age = Calendar.getInstance().get(Calendar.YEAR) - yearOfBirth;
}
public int getAge() {
return age;
}
}
在另一个 class 的某个地方,我们有这个......如果年龄是 public,我们真的可以通过更改它而不更新出生年份来搞乱我们的对象的状态。
public static void main(String[] args) {
Person bob = new Person(2000);
System.out.println("Bob's age: " + bob.getAge());
bob.age = 100; //This would be BAD!
}
通过封装 age 变量,可以防止意外更改,我们的 class 可以管理自己的状态。任何使用我们的 class 的人都不必关心计算一个人的年龄,因为它封装在我们的 class.
中"Private" 变量表示 "controlled" 访问而不是 "no" 访问。例如我可以通过只有 getter 方法而没有 setter 方法来创建变量 read-only。所有者 class 决定提供给变量的访问权限 - 通过它向 public.
公开的方法我还可以在存储值之前验证它并拒绝不允许的值。我还可以记录对值的更改。
它还可以同步多个变量,使它们都处于一致的状态,例如同时进行借记和贷记。
而且不 - 其他人不能更改我的代码,例如,如果我提供我的代码作为编译的 "jar" 文件。或者,如果他们更改了它并破坏了它——他们拥有它(即对他们的代码更改造成的后果负责)。
现实生活中的类比是室友通过共享钱包分担费用。如果钱包是 public - 任何人都可以从钱包里拿钱 - 没有责任。但是假设其中一个室友(拥有 class)拥有钱包(私有变量)- 并提供一个 "getter"(你要钱,我会从共享钱包给你)来访问钱包 - 有更多的责任。再也没有人会毫不犹豫地从钱包里拿钱了。然后钱包的管理员可以记录对它的所有访问 - 以防出现错误(争议) - 以解决问题。类似地,"addToWallet" 方法(室友贡献钱包)可用于将钱添加到钱包 - 与任何室友添加的开放钱包相比,它具有更多的责任感 / 随意取钱。
数据Hiding/Encapsulation:
数据隐藏与抽象不同。不要将一个与另一个混淆。
Abstraction is hiding the code implementation from other Object/user whereas Data hiding is achieved by Encapsulation via POJO classes.
Data hiding has to do with the instance variables which decides the state of the Object. Hiding its content using the setter() and Getter() methods is Data Hiding/ Encapsulation.
您可能想知道,getter() 方法如何隐藏数据,而它只是 returns 我们请求的数据,但关于 getter/setter 方法有一个不为人知的故事。
例子: 参考下面代码中的getName()方法
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
// can restrict the code without displaying data to user
if(condition)//restricted user check
return null;//returning null because the user is not supposed to view the data
return name;
}
}
这只有在访问修饰符是私有的情况下才有可能,因为如果它们是 public 或其他我们可以通过对象直接访问它们。如果它是私有的,只有这样你才能限制你的代码。