我很困惑,因为我一直听到的是Java中的Private variables
应该保护代码或变量。但是,如果任何人都可以访问代码,那么如果它是私有的则没有区别,他们仍然可以改变它。那么,当有权访问代码的任何人都可以改变它时,如何将其视为受保护。
答案 0 :(得分:5)
当程序员谈论访问变量时,他们意味着在程序运行时访问值。保护代码免受更改完全是另一回事,需要人工流程而不是编程语言的语法。在代码运行时使变量私有“保护”其值。在这个层面上,我们并不关心如何保护它免受其他程序员改变代码本身的影响。所谓的“数据隐藏”的目的是使内部数据与使用该类的其他类隐藏。那些其他类应该只通过调用类的方法来访问行为,而不是直接更改变量的值。
遵循“数据隐藏”等一般编程原则,以帮助我们作为程序员编写正确的代码。如果任何类可以更改变量的值,则很难确保该值有效。例如,您有一个变量可以计算工厂制造的小部件数量。通过使变量成为私有数据成员,您可以更轻松地确保该值永远不会为负。另一方面,如果变量是公共的,另一个类可以将其更改为负值,这可能导致代码的其他部分崩溃。
答案 1 :(得分:3)
为什么java中的变量是私有的
要实现封装, 无法在课堂外访问 。这并不意味着程序员无法更改源代码。
答案 2 :(得分:1)
Public =可与其他Class
一起访问私人=无法与其他班级
访问因此,如果您有私有变量,则无法使用其他类
访问它
答案 3 :(得分:1)
"私人"变量意味着控制"访问不是"不"访问。例如我可以通过只有一个getter方法和没有setter方法使变量只读。拥有类决定了对变量的访问权限 - 通过它暴露给公众的方法。
此外,我可以在存储之前验证该值并拒绝不允许的值。我也可以将更改记录到值。
它还可以同步多个变量,使其全部处于一致状态,例如同时进行借记和贷记。
没有 - 其他人无法更改我的代码,例如,如果我将我的代码作为已编译的" jar"文件。或者如果他们改变它,并且他们打破它 - 他们拥有它(即负责他们的代码改变的后果)。
现实生活中的一个类比是室友通过共享钱包分摊费用。如果钱包是公开的 - 任何人都可以从钱包中取钱 - 没有责任。但是,让我们说其中一个房间伙伴(拥有类)拥有钱包(私人变量) - 并提供一个" getter" (你要钱,我会从共享的钱包里给你)来访问钱包 - 还有更多的责任。再也没有人从钱包里拿钱了。然后,钱包的管理员可以记录对它的所有访问 - 如果出现错误(争议) - 来解决问题。同样地" addToWallet"方法(对钱包有贡献的房间伙伴)可以用来为钱包增加钱 - 再次提出更多责任,而不是钱包躺在空旷的房间里添加任何房间伙伴 /不情愿地从中取钱。
答案 4 :(得分:0)
变量是私有的,用于保护对象的状态 - 在面向对象的编程术语中,这称为encapsulation。
这是一个非常简单的例子。想象一下,我们有一个人类,而一个人的年龄是根据他们出生的年份计算的。
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;
}
}
在某个地方的另一个班级,我们有这个...如果年龄是公开的,我们可以通过更改它而不更新出生年份来弄乱我们对象的状态。
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!
}
通过封装年龄变量,它可以避免意外更改,我们的类可以管理自己的状态。任何使用我们班级的人都不必关心计算一个人的年龄,因为这已经包含在我们班级中。
答案 5 :(得分:0)
保持简单:
私有变量,是仅对其所属的类可见的变量。
希望您了解封装。它实际上将对象状态(字段)和行为(方法)绑定在一起。
如何在java中实现encapsulation
:
1)*Make the instance variables private*
因此无法直接从课外访问它们。您只能通过类的方法设置和获取这些变量的值。
2)在类中使用getter和setter方法来设置和获取字段的值。
让我举一个实时的例子来更好地理解。
public class bank_balance
{
public String owner;
public int balance;
public bank_balance( String name, int dollars )
{
owner = name;
if (dollars >= 0)
balance = dollars;
else
dollars =0;
}
}
我们声明我们的字符串和整数是公开的。这意味着系统中的任何对象都可以更改余额(将其设置为零,甚至给我们一个负余额)。这可能会导致程序崩溃,即使我们在构造函数中编写代码以防止负余额。
相反,我们应该提供一个getBalance / setBalance方法,并将我们的平衡设为私有或保护。其他对象仍然可以访问数据,但是他们无法将无效数据放入。
public class bank_balance
{
public String owner;
private int balance;
public bank_balance( String name, int dollars )
{
owner = name;
if (dollars >= 0)
balance = dollars;
else
dollars =0;
}
public int getBalance()
{
return balance;
}
public void setBalance(int dollars)
{
if (dollars >= 0)
balance = dollars;
else
dollars = 0;
}
}
希望这会有所帮助..!
答案 6 :(得分:0)
数据隐藏/封装:
数据隐藏与抽象不同。不要混淆另一个。
抽象是从其他对象/用户隐藏代码实现 而数据隐藏是通过POJO类封装实现的。
数据隐藏与决定的实例变量有关 对象的状态。使用setter()和隐藏其内容 Getter()方法是Data Hiding / Encapsulation。
你可能想知道,getter()方法是如何隐藏数据的,而它只是返回我们请求的数据,但是有一个关于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;
}
}
这只有在访问修饰符是私有的情况下才有可能,因为如果它们是公共的或其他我们可以通过对象直接访问它们。如果它是私有的,那么只有你能够限制你的代码。