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

一.

介绍一下多态中,有静态函数的例子。

(静态和动态的区别在哪儿?静态只能是所属类名来调用)

编译运行的时候,我觉着应该出错。原因是method()是父类静态方法,只能是父类名来调用,这里显然不是的。

DOS的结果存在,和我想像的不一样。而且输出的是父类的函数。

怎么静态输出的是父类中的方法?不是覆盖么?

上一节非静态的函数,为什么输出的是子类的函数,因为非静态必须是要依靠子类对象来调用。因此它依赖的是对象,它必须动态绑定到指定的对象上。到静态方法上就不是了。

静态的函数是存放在方法区中的静态区,两个类一加载,它们就已经存在了。两个静态的show()都有自己所属,是固定的。类一加载就能直接调用,不需要对象,立刻就有所属了。(这说明什么?数据都是有所属的) 这是静态绑定的。

非静态为什么是动态的,父类的子类有很多种,到底是哪个子类对象调用的,必须找到对应的对象。随着对象的变化,非静态函数所属也在变化,所以它是动态的。

既然静态的已经不依赖于特定的对象了,那么哪种类型调用静态方法,就是用哪种类型的静态的方法。如果该类没有静态方法,还要执意调用,估计会出错。(new Zi()在这里就没什么作用了)

而且new Zi()对象已经提升为了父类型了,那么肯定是调用父类型的静态方法。

视频认为,静态方法不涉及多态性。对象的多态性,这里都没利用到对象,所以才会这么说。

直接类名调用就可以了,没必要再去设计一个多态来调用静态方法。

对于继承中,覆盖的理解还是不够深入,尤其在涉及到多态的时候,容易出错。

在多态的成员变量,成员函数,静态函数三者的介绍中,成员变量,静态函数看的都是左边。成员函数比较特殊,编译看左边,运行看右边。因为非静态方法被覆盖了,具体运行哪一个,要看具体的对象。

会过头来对之间谈论的程序进行一个梳理,分析

调用的函数那一块,涉及地就是多态的知识点。USB和UPan是两个类型,都已经存在等号了,那说明这个对象多了一个类型。

更为完善的写法就是加上一个判断,看是否插入了相应规则的外设。

上图的例子讲的是接口的应用,规则,扩展,只不过里面涉及了多态的知识点。

原文地址:https://www.cnblogs.com/wsw-bk/p/7830806.html