static方法能否被重写?

原文地址: (技术点)能不能重写静态方法?

答案: 不能

我们在子类重写父类的静态方法在编译过程是不会报错的,但是却达不到预期的效果。

也就是说,重写静态方法,java不会阻止你这么做, 但是你却得不到预期的结果(父类的引用指向子类对象的时候,调用的仍然是父类的静态方法)。

下面我们来写几个方法看一下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class SuperClass{ 
//父类静态方法
public static void staticMethod(){
System.out.println("SuperClass: inside staticMethod");
}
}

public class SubClass extends SuperClass{
//重写父类静态方法
public static void staticMethod(){
System.out.println("SubClass: inside staticMethod");
}

public static void main(String []args){
//父类引用指向父类对象
SuperClass superClassWithSuperCons = new SuperClass();
//父类引用指向子类对象(多态)
SuperClass superClassWithSubCons = new SubClass();
//子类引用指向子类对象
SubClass subClassWithSubCons = new SubClass();

superClassWithSuperCons.staticMethod();
superClassWithSubCons.staticMethod();
subClassWithSubCons.staticMethod();
}
}

运行结果:

1
2
3
SuperClass: inside staticMethod 
SuperClass: inside staticMethod // 输出的还是父类的静态方法
SubClass: inside staticMethod

我们预期的superClassWithSubCons(第二个) 输出的应该是子类的静态方法,然而却输出了父类的静态方法。

为什么静态方法这么特殊呢?

原因是因为静态方法是属于类的方法,他在编译期就已经存储在了方法区,当我们使用父类引用调用子类静态方法时,会直接在方法区去找这个方法,找到的当然是属于父类的静态方法。

一个类的静态方法和静态变量都在方法区

静态方法是在编译阶段使用了编译类型信息,进行静态绑定的。

而普通方法使用父类引用调用子类方法时,我们java栈里面找到引用,然后在堆里面找到了子类的对象,那么调用的是子类的方法。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信