class a{  public void  test1(){System.out.print("a:test1");}
 }
class b extends a{  public void  test1(){System.out.print("a:test1");}
  public void  testOnly(){System.out.print("b:testonly");}}
public  class c
{
  public static void main(String[] args){
   a a_1=new b();
   a_1.test1();//输出a:test1
    a_1.testOnly();//编译出错  找不到相应方法
   
    
}
}代码与运行结果如上,正如大家所知  动态绑定是 将调用方法的调用与方法主体进行绑定,因此由于a_1所引用的是b对象所以直接调用了b中的test1() 但为什么testonly()方法时候就报错呢   既然方法的调用都是动态绑定过程  为什么就不能因为找到b对象而使用b的方法???/

解决方案 »

  1.   

    动态绑定  ,编译器会首先查看对象的声明类型和该对象类型下的所有方法列表,a a_1=new b();
    声明是a类型,就要将所有a类型下的方法找出来,然后根据对象的指向 是b () 调用b类中的方法。而目前你的a类中根本没有testOnly()方法,所以编译器会报错。你在a中也写个 testOnly()方法,哪怕是空实现都行。
      

  2.   


    其实 可以找到 b 对象
    但 只能找到 b 对象中的 test1()因为你用a的类型为参照找b对象,a的类型里有test()1所以可以只能找到b中的test1()
    但a类型里没有testOnly()啊!!所以错了
      

  3.   

    如果还能调用,和如下声明还有什么区别呢
    b a_1=new b();