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();

因此,如果超类和子类具有相同签名的静态方法,尽管子类对象可以使用超类方法的副本。但由于它们是静态的,方法调用在编译时就自行解析,因此无法使用静态方法进行覆盖。

但是,由于静态方法的副本可用,因此如果调用子类方法,超类的方法将被重新定义/隐藏。


相关文章