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

Java 为什么我可以在子类的实例上调用私有方法,而它不应该';实例不可见吗?,java,polymorphism,instance,private,Java,Polymorphism,Instance,Private,这个问题类似于 我相信答案是正确的。代码应该运行。但是当我把代码改成这样的时候 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();

这个问题类似于

我相信答案是正确的。代码应该运行。但是当我把代码改成这样的时候

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不是动态调用类的实例特定方法吗
  • 这不应该引发运行时异常吗
  • 这是否意味着该方法实际上是继承的,但通常不可访问
在您的示例中,马是一种动物。是的,
有一种方法叫做
,因为每一种
动物
都有一种这样的方法,而每一匹
都是
动物

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

因此,您的示例按照预期的方式工作


最后,请特别回答“标题”中的问题

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

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

在您的示例中,马是一种动物。是的,
有一种方法叫做
,因为每一种
动物
都有一种这样的方法,而每一匹
都是
动物

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

因此,您的示例按照预期的方式工作


最后,请特别回答“标题”中的问题

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


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

这些类是在同一个文件中定义的吗?@KevinKrumwiede这有关系吗?@KevinKrumwiede,文件与成员可见性无关。@KevinKrumwiede,你是在说内部类还是在同一个文件中定义的类?因为这是两个非常不同的概念。如果您谈到内部类,那么显然它们需要在同一个文件中定义,因为一个必须在另一个文件中定义。Java不支持跨多个文件的类定义。正如您在问题中所看到的,它绝对不是关于内部类的。所以,这也没关系。最后,将外部类称为“parent”是非常不精确的。。。这种讨论必须非常精确,否则就太复杂了pointless@KevinKrumwiede,你看到
类动物{类马…{…}
?或者你看到
类马。。。{}类动物{}
?它们是完全不同的东西,我希望你同意这一点。在第一类中,
动物的一个内部类
。第二,它不是。最后,您可能没有尝试编译,是吗?它完全可以编译。去试试吧。在任何目录中创建一个名为
anives.java
的文件,然后复制并粘贴该示例代码。然后运行
javacAnimals.java
。Boom,已编译。这些类是在同一个文件中定义的吗?@KevinKrumwiede这有关系吗?@KevinKrumwiede,文件与成员可见性无关。@KevinKrumwiede,你是说内部类还是在同一个文件中定义的类?因为这是两个非常不同的概念。如果您谈到内部类,那么显然它们需要在同一个文件中定义,因为一个必须在另一个文件中定义。Java不支持跨多个文件的类定义。正如您在问题中所看到的,它绝对不是关于内部类的。所以,这也没关系。最后,将外部类称为“parent”是非常不精确的。。。这种讨论必须非常精确,否则就太复杂了pointless@KevinKrumwiede,你看到
类动物{类马…{…}
?或者你看到
类马。。。{}类动物{}
?它们是完全不同的东西,我希望你同意这一点。在第一类中,
动物的一个内部类
。第二,它不是。最后,您可能没有尝试编译,是吗?它完全可以编译。去试试吧。在任何目录中创建一个名为
anives.java
的文件,然后复制并粘贴该示例代码。然后运行
javacAnimals.java
。轰,编译。