A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

父类中的static方法能否在子类中被重写?

class Fu
{
        static void show()
        {
                  code.......;
         }

}
class Zi extends Fu
{
        static void show()
        {
                  code.......;
         }
}




这样算是重写吗?


Fu f = new Zi();
f.show();调用哪个方法?


在内存中他两个是不是在一起啊



评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
静态方法不能被重写,他是属于类级别的。一个类共用。所以,如果你一个类 A 其中有个静态方法 a ,子类B继承A,其中也有一个静态方法a,这两个并不是继承关系,也没有多态的特性。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报 1 0
这个应该也算是重写吧,只不过静态成员函数的重写没有多大意义
静态成员先于对象存在,在类一加载到内存时就被绑定到类,所以Fu f=new Zi(); f. show()执行就只与左边引用型变量f所属的类(Fu)有关,而与f对象所属的类(Zi)无关.
Fu和Zi中的show()函数在内存中应该存在于各自的类代码块中,不是在一起的
class Fu
{
        static void show()
        {
                 System.out.println("fu");
         }

}
class Zi extends Fu
{
        static void show()
        {
                  System.out.println("zi");
         }
}


public class Test6 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
        Fu f=new Zi();
        f.show();

        }
运行结果是fu.
毕老师基础视频中有关于多态中静态和非静态成员的特点说明,自己学习后一直是按前面所说来理解的,不对的地方还请指正~

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
父类的静态方法是不同被子类重写的。你的程序里边f.show调用的是父类的静态方法。
回复 使用道具 举报
毕老师说过,这是重写(覆盖).
记住大家:
重载:只看同名函数的参数列表。
重写:子父类方法要一模一样。

重写(覆盖):
1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
2,静态只能覆盖静态。


但是在多态特性里面,又出现以下特性:
成员函数在多态调用时,编译看左边,运行看右边。
成员变量 ---无论编译和运行,都参考左边(引用型变量所属的类)。
静态函数 --- 编译运行都看 = 左边。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马