Java 中父类的静态方法为何会被子类隐藏?


当我们有两个类,其中一个类继承另一个类,并且如果这两个类具有相同的方法(包括参数和返回类型,例如,sample),则子类中的方法会覆盖父类中的方法。

即,由于它是继承。如果我们实例化子类,则会在子类对象中创建父类成员的副本,因此子类对象可以使用这两个方法。

但是,如果调用方法(sample),则会执行子类中的 sample 方法,从而覆盖父类的方法。

示例

class Super{
   public static void sample(){
      System.out.println("Method of the superclass");
   }
}
public class OverridingExample extends Super {
   public static void sample(){
      System.out.println("Method of the subclass");
   }
   public static void main(String args[]){
      Super obj1 = (Super) new OverridingExample();
      OverridingExample obj2 = new OverridingExample();
      obj1.sample();
      obj2.sample();
   }
}

输出

Method of the superclass
Method of the subclass

覆盖静态方法

当父类和子类包含相同的方法(包括参数),并且它们都是静态方法时。父类中的方法将被子类中的方法隐藏。

这种机制简称为方法隐藏,尽管父类和子类具有相同签名的方法,但如果它们是静态的,则不被视为覆盖。

示例

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

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

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

更新于: 2020-07-02

2K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告