在下面的程序中,我重写了静态和实例方法,当我使用超类调用实例方法时,它正在执行子类方法,但是在静态方法的情况下,它正在执行超类静态方法。这是为什么?
class Superclass
{
public void print()
{
System.out.println("superclass print");
}
public static void staticPrint()
{
System.out.println("Superclass static print");
}
}
public class Subclass extends Superclass
{
public static void staticPrint()
{
System.out.print("subclass staticPrint");
}
public void print()
{
System.out.println("subclass print");
}
public static void main(String... args)
{
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
superclass.print();
}
}
输出:
Superclass static print
subclass print
答案 0 :(得分:3)
静态方法不能重写,只能是隐藏,就像变量一样。 请查看here了解更多详情:
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法隐藏超类中的方法。
隐藏静态方法和覆盖实例方法之间的区别具有重要意义:
被调用的重写实例方法的版本是子类中的版本。 被调用的隐藏静态方法的版本取决于它是从超类还是从子类调用。
答案 1 :(得分:1)
静态方法没有方法覆盖。 superclass.staticPrint()
相当于Superclass.staticPrint()
。
调用静态方法时,superclass
变量引用的实例的类型根本不重要。它甚至可以包含null
,staticPrint()
类的静态方法Superclass
仍将被执行。
答案 2 :(得分:0)
首先不能覆盖静态方法。 当引用静态方法或变量时,它将始终使用声明的类
的默认值Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
不需要实例化静态方法。唯一重要的是超类声明为超类。
虽然实例方法总是引用其“实例”实现,因为实现依赖于对象的状态。
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
superclass.print();
因为超类被实例化为子类。它将调用子类实现,因为实例方法需要执行一个状态。