为什么我们在Java中声明私有变量

时间:2018-02-16 04:25:52

标签: java variables private-members

我很困惑,因为我一直听到的是Java中的Private variables应该保护代码或变量。但是,如果任何人都可以访问代码,那么如果它是私有的则没有区别,他们仍然可以改变它。那么,当有权访问代码的任何人都可以改变它时,如何将其视为受保护。

7 个答案:

答案 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;
    }

}

这只有在访问修饰符是私有的情况下才有可能,因为如果它们是公共的或其他我们可以通过对象直接访问它们。如果它是私有的,那么只有你能够限制你的代码。