类的对象可以访问其私有方法吗?

Posted

技术标签:

【中文标题】类的对象可以访问其私有方法吗?【英文标题】: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 是该类的内部类吗? 因为语法错误很难确定,但是医院是嵌套在士兵里面的吗? 哦.. 直到现在我还没有明白.. 我明白了.. 额外的 造成了所有的混乱 【参考方案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

【讨论】:

以上是关于类的对象可以访问其私有方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java中子类继承了父类的私有属性及方法吗?

朋友类对象可以在其成员函数中访问派生类对象上的基类私有成员吗?

java中私有的属性、静态成员可以被子类继承吗?

Java-利用反射访问类的私有(private)属性及方法&private的意义

Java-利用反射访问类的私有(private)属性及方法&private的意义

C++中用new开辟一个对象后怎么给其私有数据成员赋值