一直觉得自己对访问权限和函数覆写还挺明白的,直到碰见下面这个情况:
有三个类Animal、Dog和Test;Animal和Test在一个包中,Dog在另一个包中;Dog继承了Animal;Animal和Dog中的bark()方法都是默认权限的。Test中生成一个Animal引用的Dog对象,调用bark()方法的打印结果是animal bark。我的问题是:不是说java中函数调用都是根据对象的实际型别进行的吗?难道只有构成多态的时候才是根据对象的实际型别进行调用,没有构成多态的时候都是根据对象的引用型别调用?package a;
public class Animal {
  void bark(){
    System.out.println("animal bark");
}-------------------------------------package b;
import a.Animal;
public class Dog extends Animal{
  void bark(){
    System.out.println("dog bark");
}---------------------------------------package a;
import b.Dog;
class Test {
  public static void main(String[] args) {
    Animal anim = new Dog();
    anim.bark();
  }
}

解决方案 »

  1.   

    不太确定,关注一下。
    但感觉应该是语法规定。
    因为如果a包里能直接调用b包里的friendly方法的话,那就违背了访问权限规则了。所以,这个规则应该根据多态和封装综合作用在制定。
      

  2.   

    而且从现象上看也的确如此,因为只需要把Animal的bark的原型定义成public就会打印出Dog Bark了。
      

  3.   

    曾经有一贴问过类似的问题
        Animal anim = new Dog();//anim指向的是Dog的对象.
        anim.bark();//这里根据实际所指向的对象来调用方法.
      

  4.   

    大哥,这个问题是涉及到命名空间的问题,因为你在animal与dog里的bark方法都是包访问的,这样两个不同包的方法如何调用??你可以试试把Animal与Dog里的bark方法都加成public看看!
      

  5.   

    如果Test放到b包,会打印出"dog bark"来。
    默认权限的方法在不同的包中是不可见的。
      

  6.   

    没什么好说的理由,我感觉肯定是语法规定,找本权威一点Java Spec,应该可以查到的。
      

  7.   

    to rower203(华仔) Test放到b包连变异都不会通过的,b包访问不到Animal的bark方法
      

  8.   

    首先可以肯定一点,Dog和Animal的bark()方法没有构成函数覆写,也就是说不是多态。然后就不明白到底怎么回事了。