Java 中静态方法的阴影
java 8object oriented programmingprogramming更新于 2025/11/7 8:44:17
当超类和子类包含相同的实例方法(含参数)时,调用超类方法时,子类方法会覆盖超类方法。
示例
class Super{
public void sample(){
System.out.println("Method of the Super class");
}
}
public class MethodOverriding extends Super {
public void sample(){
System.out.println("Method of the Sub class");
}
public static void main(String args[]){
MethodOverriding obj = new MethodOverriding();
obj.sample();
}
}
输出
Method of the Sub class
方法遮蔽
当超类和子类包含相同的方法(包括参数)且这些方法为静态方法时,超类中的方法将被子类中的方法隐藏。这种机制称为方法遮蔽。
示例
class Super{
public static void demo() {
System.out.println("This is the main method of the superclass");
}
}
class Sub extends Super{
public static void demo() {
System.out.println("This is the main method of the subclass");
}
}
public class MethodHiding{
public static void main(String args[]) {
MethodHiding obj = new MethodHiding();
Sub.demo();
}
}
输出
This is the main method of the subclass
原因
方法重载的关键在于,如果超类和子类中的方法签名相同,则这两个方法对于子类的对象都可用。根据用于保存对象的对象类型(引用),相应的方法将被执行。
SuperClass obj1 = (Super) new SubClass(); obj1.demo() // 调用超类的 demo 方法 SubClass obj2 = new SubClass (); obj2.demo() // 调用子类的 demo 方法
但是,对于静态方法,由于它们不属于任何实例,因此您需要使用类名来访问它们。
SuperClass.demo(); SubClass.Demo();
因此,如果超类和子类具有相同签名的静态方法,尽管子类对象可以使用超类方法的副本。但由于它们是静态的,方法调用在编译时就自行解析,因此无法使用静态方法进行覆盖。
但是,由于静态方法的副本可用,因此如果调用子类方法,超类的方法将被重新定义/隐藏。

