abstract class A 
{
abstract void m1();
public void m2(){System.out.println("A中定义的m2方法");}
}
class B extends A
{
void m1(){System.out.println("B中定义的m1方法");}
}
public class Test
{
public static void main(String args[])
{
A c=new B();  //我的理解,在内存上,肯定是先执行生成B对象,然后,把指针给类A
c.m1();    //先找A中有没有此对应方法,没有再到B中找
c.m2();
}
}
大家认为,我分析的对吗?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【sure2003】截止到2008-07-22 13:50:40的历史汇总数据(不包括此帖):
    发帖的总数量:259                      发帖的总分数:10793                    每贴平均分数:41                       
    回帖的总数量:223                      得分贴总数量:7                        回帖的得分率:3%                       
    结贴的总数量:256                      结贴的总分数:10673                    
    无满意结贴数:2                        无满意结贴分:50                       
    未结的帖子数:3                        未结的总分数:120                      
    结贴的百分比:98.84 %               结分的百分比:98.89 %                  
    无满意结贴率:0.78  %               无满意结分率:0.47  %                  
    值得尊敬
      

  2.   

    你的理解是对的,但很多知识你理解了并不代表是会用,也就是说,你知道为什么要这样写吗?
    如果想深入点理解,那就多理解多态的好处和用途,你会发现在GOF的设计模式里,你上面的理解在设计模式里灵活的实现。
      

  3.   

    A c=new B();         
     c.m1();    
       c.m2();我换成
     new B().m1();
     new B().m2();
    结果是一样的,为什么..越来越不理解了.
      

  4.   

     c.m1();    //先找A中有没有此对应方法,没有再到B中找
    我感觉这么说是错误的。即使A中有,也必须看看B是否进行了覆盖,如果覆盖了,这里需要调用B中实现的方法。
      

  5.   

    多态,c调用的m1方法就是B中实现的,因为c应用的是一个B类型的对象。
    m2方法B没有进行覆盖,依次往类型层次上面去找,找到就调用,如果 找到最上层的Object还没找到这个方法,错误。
    去看一下Swing中的类型层次,很多添加时间之类的方法全是从Component等较高层次的类中定义的。子类一般不需要覆盖这些方法,调用的时候直接去父类找。
      

  6.   

    我这么说好像也是错误的。
    运行的时候可以直接确定c是B类型的引用,所以应该直接看B中是不是 有这个方法的实现,没有的话才去父类中,不管是不是覆盖了。
    这样可能更准确一下。期待高人指导一下。
      

  7.   

     A c=new B(); 
    如果父类中没有定义,用c直接调用B中新增加的方法的话,这样是不允许的。感觉原因应该是方法调用会在编译期检查其正确性,而具体调用就是运行时的动态绑定了。
      

  8.   

          想要深入理解这个问题应该得去JVM规范.看看方法覆盖的时候是怎么做的....
      

  9.   

    To LZ:
    你new的时候是什么类型的对象,在java里面就会调用什么类里面的方法:所以
    不管你是 A c = new B();
    还是    B c = new B();
    当你执行 c.m1()的时候它都是执行B类的m1方法.因为对象c指向的内存是一个B类型的对象(这是由new B()来决定的)而另一种情况:
    如果B类继承了A类,但B没有实现m2方法,而A类实现了m2方法的话,当执行c.m2()时,执行的就是B的m2方法.
      

  10.   


    是楼上这位兄弟的理解,想想,用new B()做了什么,不就是一个指向类B的指针,当A c= new B()时,把指针给了A,也就是多态操作,但在运行时,是直接到B中找是否有该方法,如果没有,则到父类去查是否有该方法,一直到Object类,否则,就会报出NO METHOD DEFINED异常。我认为,应该是从下面到上面,而不是从上面到下面。
      

  11.   

    我觉得B类继承了A类所有的属性和方法,但是B类的m1方法覆盖了A类的m1方法,根本和多态无关吧?
      

  12.   

    c.m1();    //先找A中有没有此对应方法,没有再到B中找
    A中如果没有m1()方法的话是会报错的,所以A中一定要有这个方法,有了之后再到B中找,B中有的话就调用B中的方法,没有就调用A中的方法
      

  13.   

    A c=new B();        
    c.m1();    
      c.m2(); 我换成 
    new B().m1(); 
    new B().m2(); 
    结果是一样的,为什么..越来越不理解了因为B类继承了A类,所以构造函数 new B()时,运行都会先执行父类,再执行子类。
    B类中没有m2()方法,但是他继承了A类,所以执行了A类的m2()
    所以结果当然一样罗
      

  14.   


    abstract class A 
    {
    abstract void m1();
    public void m2(){System.out.println("A中定义的m2方法");}
    }
    class B extends A
    {
    void m1(){System.out.println("B中定义的m1方法");}
    public void m2()
    {
    System.out.println("B中定义的m2方法");
    }
    public void m3(){System.out.println("B中定义的m3方法");}  //m3只属于B
                                                         //new B()时为什么没有带进来
    }
    public class Test
    {
    public static void main(String args[])
    {
         A c=new B();
         c.m1();
         c.m2();
         c.m3();   //这里编译会出错,不解中.虽然是A的类型,但毕竟由new B()产生的对象啊...
    }
    }
      

  15.   

    额滴神呐!!m3()是B的方法,你用A类的引用显然不能使用了。
    这涉及到类的upcasting。
      

  16.   

    对象变量 c 是 A 类型的,而 A 类包含的方法其子类一定包含,所以无论运行时 c 引用哪个类的对象,那个类肯定有 A 中定义的方法 m1, m2(即便被子类覆盖了那它也包含着两个方法)。在编译时编译器只能检测出 c.m1() 或 c.m2() 一定合法,而不知道实际运行时 c 是否引用的是 B 类的对象,所以编译器不确定 c.m3() 在运行时
    是否合法,所以编译报错。