有段程序如下:
 class   A{   
      void   Callme()   
      {   
          System.out.println("Inside   A's   Callme   method");   
      }   
  }   
  class   B   extends   A{   
      void   Callme()   
      {   
          System.out.println("Inside   B's   Callme   method");   
      }   
  }   
  class   C   extends   A{   
      void   Callme()   
      {   
          System.out.println("Inside   C's   Callme   method");   
      }   
  }   
    
  class   Dispatch   
  {   
      public   static   void   main(String[]   args)   
      {   
      A   a   =   new   A();   
      B   b   =   new   B();   
      C   c   =   new   C();   
      A   r;   
    
      r   =   a;   
      r.callme();   
        
      r   =   b;   
      r.callme();   
    
      r   =   c;   
      r.callme();   
      }   
  }   
    
  结果:   
  Inside   A's   callme   method   
  Inside   B's   callme   method   
  Inside   C's   callme   method这里想问的是关于:”父类引用变量可以引用子类对象“的问题,
 在一些资料里看到的描述提出“这个引用可以访问的是父类中的内容”
  这里为什么结果不一样呢?按我理解应该是使用父类中的方法。难道是因为方法的重写?
  请高手具体的说一下这里的关系,对于动态方法分配和“父类引用变量可以引用子类对象”我现在有些糊涂了,“父类引用变量可以引用子类对象”这有什么 好处吗?
 这是我的处女帖,望大家支持

解决方案 »

  1.   

    r = b;
    r指向b这个对象
      

  2.   

    1楼说的对。
    r=B,r指向B,而非A。此时r会屏蔽B类有而A类不存在的变量或方法。
      

  3.   

    http://www.it.com.cn/f/edu/053/28/93833.htm
      

  4.   

    这里是多态的问题,父类引用变量是可以引用子类对象,但是子类私有的东西,父类不能访问,实际是按照new那个对象,就调用那个对象的方法。
      

  5.   

    父类引用指向子类对象,当调用父类的方法时,如果子类中有覆写,则调用子类的方法;没有则调用父类中的方法
    另外子类中新增的方法此时不可见(如你在C类中增加一个方法F(),则r=c后,r.F()将出错)A r;
    B b = new B();
    r = b;此时r为A类型的引用,但它指向的对象是B类的对象,也就是子类对象至于好处,你可以看看书,多态的用处
    举个经典的例子吧:
    Class Shape{
       public void draw()
       {
       }
    }
    Class A1 extends Shape
    {
       public void draw()
       {
       }
    }
    Class A2 extends Shape
    {
       public void draw()
       {
       }
    }每种形状都可以画,如三角形,正方形等等,但每种形状的画法又不一样
    有如下方法
    public void drawShape(Shape shape)
    {
        shape.draw();
    }
    则该方法可以根据你实际传进来的对象调用相应的方法
    比如:drawShape(new A1()),此时shape指向A1对象,则shape.draw()调用A1中的draw()
         drawShape(new A2()),此时shape指向A2对象, 则shape.draw()调用A2中的draw()如果A1 A2中没有重写draw(),都将调用Shape中的 draw()第一次回答这么长,好象有点乱,不知道你能看懂不
    希望对你有所帮助!!!
      

  6.   


    a b c 3个对象是3个引用啊,分别指向 不同的内存堆里的地址虽然你把a b c 赋给他超类的变量,但是引用是不会变的。do you understand?