【问题标题】:Can objects of a class have access to its private methods?类的对象可以访问其私有方法吗?
【发布时间】:2017-12-20 22:43:28
【问题描述】:

我是 OOPS 编程的初学者。我在一本书中研究了访问修饰符的概念并被困在一个地方:

代码如下(我不关心代码的语法,因为怀疑是概念性的):

public class Soldier{
private int health;
  public int getHealth(){
   return health;
  }
  public void setHealth(int newHealth){
   health = newHealth;
  }
}

class Hospital{
  private void healSoldier(Soldier soldierToHeal){
    int health = soldierToHeal.getHealth();
    health = health + 10;
    soldierToHeal.setHealth(health);
  }

public static void main(){
    Soldier mySoldier = new Soldier();
    mySoldier.setHealth(100);
    Hospital militaryHospital = new Hospital();

    mySoldier.setHealth(10); //Soldier wounded
    militaryHospital.healSoldier(mySoldier);//Soldier's health increased by 10
   }
}

我对@9​​87654322@ 方法有疑问。由于此方法是私有的,因此根据我对private 访问修饰符的理解,它只能在Hospital 类中访问。但是我们在main中使用相同的方法来治疗士兵。类的对象是否可以从main 访问其私有方法?

提前致谢!!

【问题讨论】:

  • 您的main 方法属于哪个类? SoldierHospital 是该类的内部类吗?
  • 因为语法错误很难确定,但是医院是嵌套在士兵里面的吗?
  • 哦.. 直到现在我还没有明白.. 我明白了.. 额外的} 造成了所有的混乱

标签: java oop access-modifiers


【解决方案1】:

允许这样做的唯一原因是您的 main 方法属于同一类的主体 - Soldier - 它还包含 Hospital 类的主体。这允许它访问private 类的任何实例的所有private 成员和方法。

也就是说,如果Hospital 类的对象将被其他类使用,并且应该允许调用healSoldier,则应该将healSoldier 公开。 Hospital 类成为 Soldier 类的内部类毫无意义。它应该是一个顶级类。

【讨论】:

  • @RichardTingle 哈,我什至没有注意到这个类是嵌套的。感谢您指出这一点。
【解决方案2】:

一个类的对象是否可以访问它的对象? 来自 main 的私有方法?

如果对象在这个类的方法中被操作,是的。

在这种情况下,main(String[] args) 方法是Hospital 的方法:

class Hospital {
    private void healSoldier(Soldier soldierToHeal) {
      int health = soldierToHeal.getHealth();
      health = health + 10;
      soldierToHeal.setHealth(health);
    }

    public static void main(String[] args) {
      Soldier mySoldier = new Soldier();
      mySoldier.setHealth(100);
      Hospital militaryHospital = new Hospital();

      mySoldier.setHealth(10); // Soldier wounded
      militaryHospital.healSoldier(mySoldier);// Soldier's health increased by 10
    }
}

我不关心代码的语法,因为怀疑是 概念一)

语法很重要。 您可能在实际问题中错误地输入了类的代码,因为 main() 方法似乎是在任何类之外定义的。

【讨论】:

    【解决方案3】:

    私有变量和方法可以在任何地方从声明它的类的实例中访问。

    在您的情况下,healSoldier 方法是通过声明它的类 Hospital 的对象调用的。

    【讨论】:

      【解决方案4】:

      “由于这个方法是私有的,根据我对私有访问修饰符的理解,它只能在 Hospital 类中访问。”

      这是一个错误的理解。

      正确的理解是: “......,成员或构造函数被声明为私有,并且当且仅当它出现在包含成员或构造函数声明的顶级类型的主体中时才允许访问。” 见https://docs.oracle.com/javase/specs/jls/se11/html/jls-6.html#jls-6.6.1 https://docs.oracle.com/javase/specs/jls/se17/html/jls-6.html#jls-6.6.1

      【讨论】:

        猜你喜欢
        • 2017-01-01
        • 1970-01-01
        • 2021-12-11
        • 2015-12-04
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多