【问题标题】:Modifying private instance variables in Java [duplicate]在Java中修改私有实例变量[重复]
【发布时间】:2015-01-21 08:08:27
【问题描述】:

所以,我在我找到的一本 Java 书籍中看到了一个示例:

public class Account {
    private String name;
    private double balance;
    private int acctNumber;

    public Account(){}

    public boolean equals(Account anotherAcc) {
        return (this.name.equals(anotherAcc.name)
                && (this.balance == anotherAcc.balance) && (this.acctNumber == anotherAcc.acctNumber));

    }


}

我们看到equals方法被重载并与另一个Account对象一起传递以检查所有实例变量是否相等。我对这段代码的问题是,它似乎认为我们正在直接访问 anotherAcc 对象中的私有变量,这看起来不正确,但它确实有效。当我在同一个类中创建一个 main 方法时,我会以某种方式访问​​私有变量,也会发生同样的事情。

相反,当我在另一个类中创建 main 方法时,才会出现可见性错误。我的问题是,为什么 Java 允许在方法中传递的对象中访问私有实例变量?是不是因为对象的类型是 Account 并且传递给的方法是名为 Account 的类的一部分?

【问题讨论】:

  • 注意,覆盖equals的正确方法是覆盖public boolean equals (Object other)
  • 我认为您应该看到链接为什么我们需要在 OOP 中使用私有变量 programmers.stackexchange.com/questions/143736/…
  • 在你的equals方法上方添加注解@Override,看看会发生什么..

标签: java


【解决方案1】:

见(我最喜欢的桌子)Controlling Access to Members of a Class:

Modifier    Class   Package Subclass  World
-------------------------------------------
public      Y       Y       Y         Y
protected   Y       Y       Y         N
no modifier Y       Y       N         N
private     Y       N       N         N  
            ↑
       You are here

由于您在同一类中,private 成员可用。

如 cmets 中所述,请注意您没有覆盖正确的 equals 方法。原始的(Object 类)需要 Object 类型的对象作为参数。

【讨论】:

  • 他从未说过他要覆盖equals,而是重载它。
  • 我明白了。所以这只是因为传入的对象恰好属于同一类,对吗?这显然不适用于任何其他对象类型。
【解决方案2】:

是不是因为对象是 Account 类型,而被传递给的方法是 Account 类的一部分?

是的private 不仅意味着该 Object,而且属于同一 class 的任何 Object 也可以访问。

【讨论】:

    【解决方案3】:

    private 限制对同一中代码的访问,而不仅仅是同一实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2011-01-23
      • 2012-04-10
      • 2013-07-07
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多