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标记您的有意覆盖。在您的情况下,这将标记一个错误,而不是隐藏隐藏的方法