经常看到有人对于 一个父类的引用指向子类对象感到很困惑,下面是个人的一点理解。代码: Father f = new Child();   //假设父类是球,子类是篮球,父类有playBall方法,子类进行重写1、在内存中(stack区)创建一个Father的引用f,在heap中new出一个Child类型的对象,并且f指向new出来的对象。2、此时对于父类引用f来说,他只知道自己指向的是一个球,并不管这个球是篮球或者足球,所以f只能访问球的相关属性和方法,而不能访问篮球(child)的方法。3、但是当你调用f.playBall()方法时,真正执行的他指向的对象的playBall方法(即时父类并不知道子类的playBall方法);假设给你一个球(实际上是个篮球),让你执行打球的方法,你肯定是用打篮球的方法来打球。这样就可以用来理解多态的概念了(假设现在给你一个足球,你就会用踢足球的方法来打球)。动态绑定、 多态 、迟绑定(相同的概念):在运行期间判断所引用对象的实际类型,根据其实际类型调用其相应的方法。如果有说错的,或说的不好的地方,还请见谅!

解决方案 »

  1.   

    像楼主这样的学习方法我感觉很好啊,对有些知识点可以很清楚的掌握。
    说下具体的吧。其他的还好,但是关于这句话“但是当你调用f.playBall()方法时,真正执行的他指向的对象的playBall方法(即时父类并不知道子类的playBall方法)”不知道是我理解的问题还是......
    弱弱的说下,在多态的情况下,如果调用子类的playBall方法(无论这个方法是否被重写),但是父类一定要有playBall方法,即使调用的是子类重写的playBall方法,如果父类没有这个方法,那么f也是看不到playBall方法的
      

  2.   

    Sub extends Basenew Sub
    在堆里也有Base对象都要先初始化父对象的直到Object为止
      

  3.   


    是的,本身的对象用this访问,要访问base里的变量和方法就用super调用。
      

  4.   


    如果调用子类的playBall方法父类并没有办法调用子类的方法(因为它自己不知道),除非你强制转换后再调用。如果父类中不存在playBall方法,在这个方法上也就不存在多态了。
      

  5.   


    编译器在父类方法中肯定能找到此方法的。应该这样理解:实例化一个子类对象后,子类的方法重写了父类的方法,相当子类的方法指针指向了自己的方法代码(在data区中),而用父类引用去调用这个方法(父类引用其实就是子类对象),得到的肯定是子类的方法代码。