public class A
{
int a;

public A()
{
a = 10;
}

public void foo()
{
System.out.println(a);
}
}
public class B extends A
{
int a;
public B()
{
a = 11;
}

public static void main(String[] args)
{
A aInstance = new A();
aInstance.foo();
B bInstance = new B();
bInstance.foo();
}
}
最后的运行结果是:
10
10
有点出乎意料,不是应该:
10
11
吗?bInstance有两个同名的变量a,为什么使用了基类的,而不优先使用子类的呢?

解决方案 »

  1.   

    第一个结果就不说了,第二个 new B()的时候,因为B extends A 就先初始化 A中的构造函数,那 a=10, 构造完了后,再构造B的函数,在B类中 a=11,但是方法在A类中,它里面的a和B中的a是不一样的
      

  2.   

    从B类中调用foo方法,this指向的是bInstance呀。
    方法在基类还是在子类中不重要吧,毕竟只是代码段的一段代码而已,调用这段的代码的时候会把this指针传入。
      

  3.   

    你的代码运行当然是10,10.你要它运行后变成10,11就在B类中再加个foo()方法就可以了.class   A 
    {
    int   a; 
    public   A() 

    a   =   10; 
    }  public   void   foo() 

    System.out.println(a); 


    public   class   B   extends   A 

    int   a; 
    public   B() 

    a   =   11; 
    }
      public   void   foo() 

    System.out.println(a); 
    } public   static   void   main(String[]   args) 

    A   aInstance   =   new   A(); 
    aInstance.foo(); 
    B   bInstance   =   new   B(); 
    bInstance.foo(); 

    }
      

  4.   

    应该是楼主大意了吧 子类中忘了写覆盖父类的foo方法……
      

  5.   

    其实很简单,子类中的方法允许访问父类中的变量,
    而父类中方法却是不能访问子类中的变量的。
    很明显B中定义了一个a,把A中的a隐藏起来了,因些,
    B中新定义的方法访问到的a都是B中的a变量。
    如果要在B中访问A中的a,要加上super才能办到。