Java重写实例和静态方法执行
在下面的程序中,我重写了一个静态方法和一个实例方法,当我使用超类调用实例方法时,它正在执行子类方法,但对于静态方法,它正在执行超类静态方法。为什么会这样Java重写实例和静态方法执行,java,inheritance,Java,Inheritance,在下面的程序中,我重写了一个静态方法和一个实例方法,当我使用超类调用实例方法时,它正在执行子类方法,但对于静态方法,它正在执行超类静态方法。为什么会这样 class Superclass { public void print() { System.out.println("superclass print"); } public static void staticPrint() { System.out.println("Superclass static
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
静态方法不能被重写,只能像变量一样隐藏。
请查看更多详细信息:
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法将隐藏超类中的方法
隐藏静态方法和重写实例方法之间的区别具有重要意义:
被调用的重写实例方法的版本是子类中的版本。
调用的隐藏静态方法的版本取决于它是从超类还是子类调用的
静态方法不能被重写,只能像变量一样隐藏。
请查看更多详细信息:
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法将隐藏超类中的方法
隐藏静态方法和重写实例方法之间的区别具有重要意义:
被调用的重写实例方法的版本是子类中的版本。
调用的隐藏静态方法的版本取决于它是从超类还是子类调用的
静态方法没有方法重写。superclass.staticPrint等同于superclass.staticPrint
调用静态方法时,超类变量引用的实例类型根本不重要。它甚至可以包含null,并且超类类的静态方法staticPrint仍将被执行。静态方法没有方法重写。superclass.staticPrint等同于superclass.staticPrint
调用静态方法时,超类变量引用的实例类型根本不重要。它甚至可以包含null,并且超类类的静态方法staticPrint仍将被执行。首先,静态方法不能被重写。 当引用静态方法或变量时,它将始终使用声明的类的默认值
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
静态方法不需要实例化。唯一重要的是超类被声明为类型超类
而实例方法将始终引用其实例实现,因为实现依赖于对象的状态
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
superclass.print();
因为超类被实例化为子类。它将调用子类实现,因为实例方法需要执行一个状态 首先,静态方法不能被重写。 当引用静态方法或变量时,它将始终使用声明的类的默认值
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
静态方法不需要实例化。唯一重要的是超类被声明为类型超类
而实例方法将始终引用其实例实现,因为实现依赖于对象的状态
Subclass subclass=new Subclass();
Superclass superclass=subclass;
superclass.staticPrint();
superclass.print();
因为超类被实例化为子类。它将调用子类实现,因为实例方法需要执行一个状态 下面的答案正确地指出,您不能覆盖静态方法。好的做法是用@Override标记您的有意覆盖。在您的情况下,这将标记一个错误,而不是静默地隐藏隐藏的方法。下面答案的可能重复正确地指出,您无法覆盖静态方法。好的做法是用@Override标记您的有意覆盖。在您的情况下,这将标记一个错误,而不是隐藏隐藏的方法