【问题标题】:Why can I invoke a private method on an instance of the sub-class when it shouldn't be visible to the instance?为什么我可以在子类的实例上调用私有方法,而它不应该对实例可见?
【发布时间】:2015-11-02 21:16:34
【问题描述】:

这个问题类似于Why can a "private" method be accessed from a different instance?

我对那里的答案深信不疑。代码应该运行。但是,当我将代码更改为这样时

class Horse extends Animals{
}

public class Animals {

    private void eat(){
        System.out.println("Generic Eating");
    }

    public static void main(String[] args){
        Animals h = new Horse();
        h.eat();
    }

}

当我尝试使用多态性来调用子类 Horse 上的私有方法 eat() 时,它会工作并调用父类的方法。

  • java不会动态调用类的实例具体方法吗?
  • 这不应该引发运行时异常吗?
  • 这是否意味着该方法实际上是继承的,但不能正常访问?

【问题讨论】:

  • 这些类是否定义在同一个文件中?
  • @KevinKrumwiede 这有关系吗?
  • @KevinKrumwiede,文件与成员可见性相关的任何事情都无关紧要。
  • @KevinKrumwiede,您说的是内部类还是在同一文件中定义的类?因为这是两个非常不同的概念。如果您谈论内部类,那么显然它们需要在同一个文件中定义,因为必须在另一个文件中定义一个。 Java 不支持跨多个文件的类定义。正如您在问题中看到的那样,它绝对与内部类无关。再说一遍,没关系。最后,称外部类为“parent”是很不精确的……这种讨论需要非常精确,否则毫无意义
  • @KevinKrumwiede,你看到class Animals { class Horse ... {...}}了吗?或者你看到class Horse ... {} class Animals {}?它们是完全不同的东西,我希望你同意这一点。首先,HorseAnimals 的内部类。在第二种情况下,它不是。最后,您可能没有尝试编译,是吗?它是完全可编译的。继续尝试吧。在任意目录中创建一个名为Animals.java 的文件,然后复制并粘贴该示例代码。然后运行javac Animals.java。繁荣,编译。

标签: java polymorphism instance private


【解决方案1】:

在您的示例中,HorseAnimal。所以是的,Horse 有一个称为eat 的方法,因为每个Animal 都有一个这样的方法,每个Horse 都是一个Animal

方法eat 由类Animal 定义,并且是该类中的私有方法。这意味着它只能从Animal 类中定义的其他方法中访问,而不能从其他方法中访问。没有超类/子类,没有包装器,没有容器,什么都没有。甚至不是Horse,尽管是一个Animal,但它本身并不是Animal

所以您的示例按照预期的方式工作。


作为最后的说明,专门回答“标题”中的问题,

为什么我可以在子类的实例上调用私有方法,而它不应该对实例可见?

唯一重要的是从哪里您正在调用该私有方法。您正在从定义它的类中调用它。因此它是可访问的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2014-03-20
    • 2010-11-04
    • 2013-12-01
    • 1970-01-01
    • 2014-04-12
    • 2010-09-24
    相关资源
    最近更新 更多