Java中静态方法的阴影

如果超类和子类包含相同的实例方法(包括参数),则在调用时,超类方法将被子类的方法覆盖。

示例

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() // invokes the demo method of the super class
SubClass obj2 = new SubClass ();
obj2.demo() //invokes the demo method of the sub class

但是,在使用静态方法的情况下,由于它们不属于任何实例,因此您需要使用类名进行访问。

SuperClass.demo();
SubClass.Demo();

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

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