2015-11-02 30 views
1

这个问题类似于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(); 
    } 

} 

,当我尝试使用多态来调用私有方法吃()的子类马它的工作原理,并调用父类的方法。

  • 不是java动态调用实例类的具体方法吗?
  • 不应该抛出一个运行时异常吗?
  • 这是否意味着该方法实际上是继承的,但通常不可访问?
+0

这些类是在同一个文件中定义的吗? –

+0

@KevinKrumwiede那很重要吗? – Tom

+0

@KevinKrumwiede,文件与任何与成员的可见性相关的内容都是不相关的。 –

回答

5

在你的榜样,一个HorseAnimal。所以是的,一个Horse有一个方法叫做eat,因为每个Animal有一个这样的方法,并且每个Horse是一个Animal

方法eat由类Animal定义,并且是该类中的私有方法。这意味着它只能从Animal类中定义的其他方法中访问,除此之外没有别的。没有超级/子类,没有包装,没有容器,没有任何东西。甚至没有一个Horse,它虽然Animal,它不是Animal本身。

因此,您的示例以预期的方式工作。


最后要注意,在“标题”明确回答了问题,

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

唯一重要的是从你调用私有方法。你从它所定义的类中调用它。因此它是可访问的。

相关问题