关于父类静态方法能不能被子类重写详细

这里首先声明:不能,不能,不能!
主要学习大佬的博客,为了方便就直接拷了他的测试代码,并加以修改说明。

首先我们讲一下重写:

子类继承父类后可直接调用父类的方法而不用去自己定义,如父类A有add方法,子类B即使没有add方法也可以调用父类的add()方法.子类在自己的类中重写add方法实现新的功能,这样就算是重写了父类的方法,关于重写的注意事项请大家自行百度。

定义Fu类和继承Fu类的子类Zi,分别包含了自己的静态方法和普通方法。 父类Fu:
package com.test;
public class Fu {  
    public static void show() {  
        System.out.println("父类的静态方法");  
    }  
    public void method() {  
        System.out.println("父类的普通方法");  
    }  
}  

子类Zi:

package com.test;


public class Zi extends Fu {  
    public static void main(String[] args) {  
        Zi zi = new Zi();  
        zi.show();  
        zi.method();  
    }  
    public static void show() {  
        System.out.println("子类的静态");  
    }  
    public void method() {  
        System.out.println("子类的普通方法");  
    }  
      
}  

运行子类的main方法,输出结果是:
子类的静态方法
子类的普通方法

这样的代码并不能看出来是不是都重写成功的,因为main里面是zi.show() zi.method(),zi类对象调用自己的方法并不能看出什么

接下来使用父类引用子类的对象

Fu类不变,修改Zi类main方法:

package com.test;


public class Zi extends Fu {  
    public static void main(String[] args) {  
        Fu fu = new Zi();  
        fu.show();  
        fu.method();  
    }  
    public static void show() {  
        System.out.println("子类的静态");  
    }  
    public void method() {  
        System.out.println("子类的普通方法");  
    }  
      
}  

输出结果是:
父类的静态方法
子类的普通方法

可以看到fu.method()输出为子类zi的一般方法,表明子类成功重写并且覆盖了父类普通方法,但是静态方法输出的还是父类fu的方法,并没有重写覆盖。
表明子类可以继承父类静态方法但是不能重写,但不影响继承,即使删除子类的show()方法代码,输出同样不变,因为调用的是父类的show方法(子类先在自己成员函数找show(),没有找到,然后就去父类找,在父类找到了)说明确实是可以继承的

package com.test;


public class Zi extends Fu {  
    public static void main(String[] args) {  
        Fu fu = new Zi();  
        fu.show();  
        fu.method();  
    }  
 
    public void method() {  
        System.out.println("子类的普通方法");  
    }  
      
} 
输出结果是:
      父类的静态方法
      子类的普通方法

好了,接下来是我的理解:
所谓静态就是指:在程序开始运行时所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间,在实例化之前这个方法就已经存在于内存,跟类的对象没什么关系。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又指定了一块给子类的静态方法,没有重写这一说,只是单纯的名字重复了。

现在子类有自己的想法,自己写了个父类没有的新方法newFun()

package com.test;


public class Zi extends Fu {  
    public static void main(String[] args) {  
        Fu fu = new Zi();  
        fu.show();  
        fu.method();  
        fu.newFun();
    }  
 
    public void method() {  
        System.out.println("子类的普通方法");  
    }  
    
    public void newFun() {  
        System.out.println("子类自己的方法");  
    }  
      
}  

然后我用父类对象接收,我尝试着用父类的这个对象去调用子类的方法fu.newFun(),直接错误error!不是异常。

父类的对象引用子类的对象,我将它们比喻成装满了水的杯子,父类对象的容量是 1L,现在子类定义了新的方法,假设现在容量是1.5L,用1L的杯子肯定装不下1.5L杯子的水。
子类对象的newFun方法父类引用根本没办法引用到那部分,所以error。

那么言归正传!回到静态方法:

例子中子类的静态方法就是它自己的方法,跟父类没有关系,父类根本引用不了子类的静态方法。
所以所以现在明白了,只是单纯的重名!!!

这里写图片描述

  • 31
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值