如果在某个方法中访问名为a的Field,但是没有显示的指定调用者,则系统查找a的顺序为什么?
(若调用方法的引用是父类型,但实际指向子类对象且子类重写了父类的方法)

解决方案 »

  1.   

    不知道你是怎样去不指定a的Field就能访问的,如果是反射的话是顺序访问,父类引用去调用的话先从父类的顺序来,如果有覆盖的就用子类的。
      

  2.   

     class Base
    {
     public int a;
    Base(){a=4;}
     public void run()
    {
     System.out.println(a);
    }
    }class Sub extends Base
    {
    public int a ;                  //(1)
    Sub(){a=9;}
    @override
    public void run()
    {
    System.out.println(a);          //(2)怎么理解此处的a,如果把(1)注释掉呢
    }
    }
    public class Test
    {
     public static void main(String[] args)
    {
     Base b =new Sub();
    b.run();
    }
    }
      

  3.   

    这个是调用的子类自己的属性,因为父类的属性已经被覆盖了,如果要用父类的a属性,要用supper关键字,或者是掉用父类的run方法,这里你的是调用子类自己的方法。
      

  4.   

    public void run() {
    int a=8;               //  (3)
    System.out.println(a); // (2)怎么理解此处的a,如果把(1)注释掉呢
    }我给你增加了一个(3)
    访问,都是从离自己最近的开始,如果找不到才是更远的,比如
    1 本方法内,或者代码段内
    2 本类内
    3 父类或超类