我们知道在 java 中可以通过覆盖来增强或者减弱父类的方法,但是覆盖是针对非 静态方法 的,那么,子类覆盖父类的静态方法会变成什么样呢?
父类里面建立两个方法和一个变量,一个是静态方法,一个是非静态方法。
子类里面覆盖父类的两个方法和一个变量。接下去开始测试了~~
首先,测试变量,我们知道在java的实例对象有两种类型,一种是表面类型,一种是实际类型。在测试类中实例的FatherMethod sm中sm的表面类型为FatherMethod,实际类型为SonMethod,那么第一句输出的变量X的实际类型为SonMethod的X值吗?还是原来的FatherMethod的X值呢?
其次,调用sm的静态方法和非静态方法,调用静态方法的时候,如果采用实例对象去调用的话,会有下划线提示警告~强迫症必须把它去掉哈哈!其实java里面推荐的调静态方法的形式为用类名去调用,因为静态方法是属于整个类的。那么调用这三个方法会输出什么呢?第一个是传统的调用非静态的子类方法,所以答案应该显而易见了。那么调用第二个方法和第三个方法会出现什么结果呢?是都调用的父类的静态方法还是都是调用子类的静态方法,还是各自调各自的呢?
揭晓答案
好吧,看到这个结果有没有恍然大悟呢?所以这里要引入隐藏的概念了,隐藏指的是在子类中重写了父类的变量和静态方法。它和重写有两种不同:
-
表现形式的不同,隐藏是用于静态方法或者成员变量的而重写是用于非静态方法。
-
职责不同,隐藏的目的是为了隐藏子类的方法或者属性,而重写是对父类的方法进行增强或者削弱。
综上所诉,大家在写继承的时候一定要注意,静态方法不能重写但是可以隐藏,最后再说一句,通过实例对象访问成员属性和方法是不好的习惯,有这个习惯的尽早改正哈哈~~~
谢谢收看~喜欢的关注一波~~每天分享一些知识~~
最后附上每天背的10个单词:
worship [‘wə:ʃip] n. 崇拜;礼拜;尊敬
especial [ɪ’speʃ(ə)l; e-] adj. 特殊的,特别的
suffice [sə’faɪs] vt. 使满足;足够…用;合格
degenerate [dɪ’dʒen(ə)rət] vt. 使退化;恶化
advocate [‘ædvəkeɪt;-ət] vt. 提倡,主张,拥护
doll [dɒl] n. 洋娃娃;玩偶;无头脑的美丽女人
consensus [kən’sensəs] n. 一致;舆论;合意
grope [grəʊp] vi. 摸索;探索
atlas [‘ætləs] n. 地图集;寰椎
reason [‘riːz(ə)n] n. 理由;理性;动机
每天学习一点点~~~加油~~!