上面题目发错了 应该是
class A 
{
 private void outa()
{
  System.out.println("in a1");
}
 public void outb()
{
  System.out.println("in b1"); 
}
public void printall()
{
  outa();
  outb();
}
}
class B extends A
{
 public void outa()
{
  System.out.println("in a2"); 
}
public void outb()
{
  System.out.println("in b2"); 
}
}
public class test
{
  public static void main(String args[])
{
  B b=new B();
  b.printall();
}  
}
为什么b.printall调用的后打出a1,b2

解决方案 »

  1.   

    因为类B中的outb把类A中的outb给覆盖了,而A中的outa是私有的(private)不能被覆盖,所以打出a1,b2。
      

  2.   

    因为你基类A的outa()是private的,它会对派生类隐藏。因此B的outa()是一个全新的方法;连从载都算不上。  (thinking in java)里的一段改了一下。  :)
      

  3.   

    动态连接问题
    运行时对象b的方法列表为outa();outb();printall();
    因为私有函数和对象不能被继承和覆盖
    所以只有outb()覆盖了父类的outb()
    而父类的printall()没有被覆盖,而他调用的outa()属于父类的私有函数
    所以,这个私有函数不能被对象b中的outa()替换
    只有在b中重载printall()如下public void printall()
    {
      outa();
      outb();
    }
    才能调用b类中的outa()方法