JAVA-初步认识-第十章-多态-成员函数

一. 成员函数

这个是重点。

上面的程序,如果按照成员变量的思路来看,这里输出的应该是“fu show”,但是对象是不存放在对象中,除非有什么关键字来指向父类。如果在多态的情况下,介绍一下内存图解就很好了。

运行结果为zi show,前面讲述多态的时候,讨论的都是成员函数,这里又忘记了。这说明什么?多态中,成员函数的用法和成员变量是不一样的。成员函数涉及的是覆盖。

现在进行整个流程的讲解,如果父类中没有show()方法,程序是否可以运行。

结果是不行,f作为Fu类,是没有show()这个方法的,子类有show(),f指向子类对象,Zi已经提升为父类了,父类没有show()方法,自然也没法输出,要从父类的角度来。如果父类中有show()方法的话,按理说就应该调用父类中的show()方法。这里面有一个动态绑定的特色。(动态绑定好像听过)

现在根据所书写的程序,进行一个内存上的解析。

根据程序的书写,主函数是入口,外界的类是在创建对象的时候,调入到内存中的。下图方法区省略了子父类show方法的方法体和构造函数,同时在创建对象时,省去了构造函数的初始化。

编译看的都是等号左侧的内容(Fu f=new Zi();  f.show();),f所属的类以及所属类的方法。如果没有,就会编译失败。但是真正运行的时候,是以子类对象为主的。内存图解就是描述的运行流程。

现在来分析f.show(),按理说f应该调用所属父类的show()方法,但是f这个引用变量,指向的是子类对象,赋值是0034。因此是对象先去寻找自己内部有无show(),有的。show()方法进栈,this赋值也是0034.

动态访问的是,最终看的是引用型变量指向的对象,最后会把show()方法绑定到指定的方法上运行,为什么?show()本身是非静态的,要依赖于对象。到底哪个调用运行,以当前对象为主。而当前对象,show()里面需要this持有来指向当前对象,这时候,show()方法就被动态绑定到这个对象上了。

如果子类中没有show()方法存在,就去找父类中的show()。为什么会是这样呢?就是继承,默许子类中复制了父类中的一切,所以子类没有,是因为子类没写。

成员函数和成员变量之间存在区别,成员函数更为复杂些。

编译那句话,说的是编译时要站在父类的角度,如果父类中没有调用的函数,那么相当于动物调用了抓老鼠的功能,这样编译是无法通过的。

非静态,动态地绑定在对象上。

 

posted @ 2017-11-14 08:24  前锋营  阅读(312)  评论(0编辑  收藏  举报