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();
因此,如果父类和子类具有相同签名的静态方法,尽管子类对象可以使用父类方法的副本,但由于它们是静态的,因此方法调用在编译时本身就会解决,静态方法无法被覆盖。
但是,由于静态方法的副本可用,如果你调用子类方法,则父类的方法将被重新定义/隐藏。
广告