http://bbs.youkuaiyun.com/topics/390297526?page=1#post-393055530
所以总结下来,关于方法能否调用有两点:
1. 方法是否属于该对象,自身的方法和继承的方法都属于对象,这是能否调用的前提,解决了有没有的问题。
2. 该方法的访问控制符(access modifier)与当前调用地点是否满足访问控制符的要求,解决了见没见的问题。
比如楼主提到的情形,方法调用发生在包外,调用点所在类又没有继承方法声明时所在类,因此不可调用(原因是方法不可见,不是没有)。而此时,调用方法的实例是继承了方法所在类这一事实构成了混淆点,它是继承,但不是方法调用发生点所在类的继承。 为什么要调用发生点所在类的继承,是因为访问控制的目的就是控制访问范围,当方法被访问(调用)时,它不希望在非继承外包类中被访问,这个限制是指方法调用地点,如果是指调用对象,那就要对实例所在类作访问控制了,但类的访问控制符不包括protected.
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html