【问题标题】:Why do we declare Private variables in Java?为什么我们在 Java 中声明私有变量?
【发布时间】:2021-12-21 16:49:36
【问题描述】:

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

【问题讨论】:

  • 见:softwareengineering.stackexchange.com/questions/143736/…。基本上制作一些private 只是说应该检索此变量并将其作为接口而不是直接作用。它保护了该项目如何使用的结构。当然你可以在你拥有的源代码中强制改变它,同样我也有人可以完全删除代码。一旦有人故意弄乱代码,这是一个静音点。
  • 所以这是礼仪的事情​​?
  • 制作 private 意味着您无法在该类之外访问它,它具有功能影响。我的意思是你可以用 anything 来说明这一点。这就像说:“如果有人可以将常量变成普通变量,为什么还要使用常量”?修改源代码的人不会影响某事的重要性。除此之外,还有很多你无法修改源代码的 API 和库
  • 这是encapsulation的一个概念,其中访问被限制在内部状态,否则通过方法(getter和setter)进行管理,它确保对象可以保持有效的已知状态
  • private 旨在保护免受你自己的伤害,即帮助防止如果使用得当,您不会犯错误。通常,private 有助于防止您随意访问变量,因此当您稍后返回并想要更改或删除该变量时,您不必修复您使用它的无数地方。

标签: java variables private-members


【解决方案1】:

Public = 可通过其他类访问

Private = 其他类无法访问

所以如果你有一个私有变量,它就不能被其他类访问

【讨论】:

    【解决方案2】:

    为什么变量在java中是私有的

    为了实现封装而这个不能在类外访问。这并不意味着程序员不能更改源代码。

    【讨论】:

      【解决方案3】:

      当程序员谈到访问变量时,他们的意思是在程序运行时访问它的。保护代码免受更改完全是另一回事,需要人工过程而不是编程语言的语法。当代码运行时,将变量设为私有“保护”其值。在这个级别上,我们不关心保护它免受其他程序员更改代码本身的影响。所谓“数据隐藏”的重点是保持内部数据对使用该类的其他类隐藏。那些其他类只能通过调用类上的方法来访问行为,而不是直接更改变量的值。

      遵循诸如“数据隐藏”之类的一般编程原则,以帮助程序员编写正确的代码。如果任何类都可以更改变量的值,则很难确保该值有效。例如,您有一个变量来计算工厂制造的小部件数量。通过使变量成为私有数据成员,您可以更轻松地确保该值永远不会为负。另一方面,如果变量是公共的,另一个类可能会将其更改为负值,这可能会导致代码的其他部分崩溃。

      【讨论】:

      • 很好的解释! :)
      • 但是如果我们正在创建其他类,为什么其他类会这样做呢?
      • @VishalSharma 其他类会做什么?
      • @Code-Apprentice 其他类可以创建该类的具有私有变量的对象。并调用它的设置器。如果它没有创建一个新的对象,它仍然可以调用同一个对象的 setter。因此,Anothe 类仍然可以将其更改为负值,从而导致代码的其他部分崩溃。我错过了什么?
      • @veritas 听起来您在问一个不同的问题,该问题仅与此问题松散相关。请单击页面顶部的“提问”按钮,以便您可以通过更多详细信息和相关代码示例充分提问。如果在您的问题的上下文中这样做有意义,请随意从您自己的问题中添加指向此问题的链接。
      【解决方案4】:

      变量是私有的以保护对象的状态 - 在面向对象的编程术语中,这称为encapsulation

      这是一个非常简单的例子。假设我们有一个 Person 类,一个 Person 的年龄是根据他们出生的年份计算出来的。

      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】:

        “私有”变量表示“受控”访问而不是“无”访问。例如我可以通过只有一个 getter 方法而没有 setter 方法来使变量只读。所属类决定对变量提供的访问权限 - 通过它向公众公开的方法。

        我还可以在存储之前验证值并拒绝不允许的值。我还可以记录对值的更改。

        它还可以同步多个变量,使其处于一致的状态,例如同时进行借记和贷记。

        不 - 其他人不能更改我的代码,例如,如果我将我的代码作为已编译的“jar”文件提供。或者如果他们改变了它,他们破坏了它——他们拥有它(即对他们的代码更改造成的后果负责)。

        现实生活中的一个类比是室友通过共享钱包分摊费用。如果钱包是公开的——任何人都可以从钱包里取钱——没有责任。但是假设其中一个室友(拥有班级)拥有钱包(私有变量) - 并提供了一个“getter”(你要钱,我会从共享钱包中给你)来访问钱包 - 有更多的责任.再也不会有人从钱包里拿钱了。然后,钱包的管理员可以记录对它的所有访问——以防出现错误(争议)——以解决问题。类似地,“addToWallet”方法(室友为钱包捐款)可用于向钱包中添加资金——同样具有更多的责任感,而不是钱包在任何室友添加时处于开放状态 / 随意取钱。

        【讨论】:

          【解决方案6】:

          数据隐藏/封装:

          数据隐藏与抽象不同。不要将一个与另一个混淆。

          抽象是对其他对象/用户隐藏代码实现 而数据隐藏是通过 POJO 类封装实现的。

          数据隐藏与决定 对象的状态。使用 setter() 隐藏其内容和 Getter() 方法是数据隐藏/封装。

          您可能想知道,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;
              }
          
          }
          

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

          【讨论】: