【问题标题】:Call private method of Parent class using Child Object [duplicate]使用子对象调用父类的私有方法[重复]
【发布时间】:2015-09-14 05:52:24
【问题描述】:

我需要调用Parent 类中存在的私有方法,并且我创建了一个扩展Parent 类的Child 类。现在我想通过Child类的对象调用Parent类中出现的私有方法,而不使用反射API。我该怎么做?

还有我可以更改Parent类的结构的权限。

class Parent{
  private void print(){
    System.out.println("Private Parent");
  }
}
class Child extends Parent{
}

【问题讨论】:

  • 你好像误解了private的意思。
  • 如果你真的想这样做,那么你可以在父级中创建另一个公共方法来调用它的打印方法
  • Parent 的私有方法可能具有微妙的状态,这可能取决于其 public 方法,并且允许您调用 Parent 的私有方法可能会破坏 havoc。因此,为了更好,应该保留 private 的内容 private ;) 我明白我的意思。
  • 问你的朋友Parent的私有方法中他/她想要访问的行为是什么?考虑是否可以以接口的形式提取该行为。
  • 是的,私有方法只能在类内部访问是正确的,但是有没有办法使用子对象在父类中调用私有方法。

标签: java inheritance private


【解决方案1】:

只能从类内部访问private 方法(参见,例如,Java's tutorial about access control)。

有时可以通过使用反射或字节码操作来规避此规则,但直接而言,您根本无法从子类访问 private 方法。如果你有这样的需求,改成protected

【讨论】:

  • 是的,私有方法只能在类内部访问是正确的,但是有没有办法使用子对象在父类中调用私有方法。
【解决方案2】:

除了反射或使用内部类之外,无法使用子对象调用Parent类中的私有方法。

【讨论】:

    【解决方案3】:

    您不能从子类调用private 方法。 private 方法只对类本身可见。将方法更改为protectedpublic 即可。

    【讨论】:

    • 是的,私有方法只能在类内部访问是正确的,但是有没有办法使用子对象在父类中调用私有方法。
    【解决方案4】:

    我知道你可以做到这一点的唯一方法 - 直接从子类调用超类的 private 成员 - 是如果子类嵌套在超类中。例如:

    class Parent {
      private void parent() {}
    
      class Child extends Parent {
        private void child() {
          parent();
        }
      }
    }
    

    将编译。请注意,如果您想将 Child 类设为静态,您也必须将 parent() 设为静态。

    否则,您不能这样做 - private 表示在该类之外无法访问。如果您希望它可以从子类中调用,则需要创建方法 protected(或 public)。将它设为final 可能会很好,以防止它在子类中被覆盖。

    【讨论】:

    • 您确定我们可以创建静态外部类吗,因为我不认为我们可以将外部类设为静态。请解释
    • 我没有说任何关于使外部类静态的事情。我说你必须使parent() - 方法 - 静态。
    • 当然,如果 Parent 嵌套在另一个类中,您可以将其设为静态。
    猜你喜欢
    • 2016-04-05
    • 2012-07-13
    • 2015-09-16
    • 2020-08-09
    • 1970-01-01
    • 2020-04-26
    • 2015-10-11
    • 2011-04-17
    相关资源
    最近更新 更多