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
。轰,编译。