静态方法为什么不能被重写
答案:2 悬赏:40 手机版
解决时间 2021-03-23 20:10
- 提问者网友:太高姿态
- 2021-03-23 10:24
静态方法为什么不能被重写
最佳答案
- 五星知识达人网友:狂恋
- 2021-03-23 10:52
不能吧,静态的变量都不可以重新定义的,静态的方法不可以继承吧,怎么重写。
全部回答
- 1楼网友:轻雾山林
- 2021-03-23 12:00
"重写"只能适用于实例方法.不能用于静态方法.对于静态方法,只能隐藏(形式上被重写了,但是不符合的多态的特性),“重写”是用来实现多态性的,只有实例方法是可以实现多态,而静态方法无法实现多态。例如: employee man = new manager(); man.test();
实例化的这个对象中,声明的man变量是employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照manager类来的,就是employee类型的man变量的指针指向了一个manager类的对象。如果对这个man调用方法,调用的是谁的?如果是非静态方法,编译时编译器以为是要调用employee类的,可是实际运行时,解释器就从堆上开工了,实际上是从manager类的那个对象上走的,所以调用的方法实际上是manager类的方法。有这种结果关键在于man实际上指向了manager类对象。现在用man来调用静态方法,实际上此时是employee类在调用静态方法,employee类本身肯定不会指向manager类的对象,那么最终调用的是employee类的方法。 由此,只能说形式上静态方法的却可以被重写,实际上达不到重写的效果,从多态的角度可以认为子类实际上是写了一个新方法,从这个角度上说静态方法无法被重写。那么也就证明了重写和覆盖就是一回事。例如:public class teststaticmethodextends { public static void main(string[] args) { a a = new b(); a.p(); } } class a { public static void p() { system.out.println("基类"); } } class b extends a { public static void p() { system.out.println("子类"); } } 输出:基类
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯