Java重写实例和静态方法执行

时间:2015-07-06 13:49:17

标签: java inheritance

在下面的程序中,我重写了静态和实例方法,当我使用超类调用实例方法时,它正在执行子类方法,但是在静态方法的情况下,它正在执行超类静态方法。这是为什么?

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

3 个答案:

答案 0 :(得分:3)

静态方法不能重写,只能是隐藏,就像变量一样。 请查看here了解更多详情:

  

如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法隐藏超类中的方法。

     

隐藏静态方法和覆盖实例方法之间的区别具有重要意义:

     

被调用的重写实例方法的版本是子类中的版本。       被调用的隐藏静态方法的版本取决于它是从超类还是从子类调用。

答案 1 :(得分:1)

静态方法没有方法覆盖。 superclass.staticPrint()相当于Superclass.staticPrint()

调用静态方法时,superclass变量引用的实例的类型根本不重要。它甚至可以包含nullstaticPrint()类的静态方法Superclass仍将被执行。

答案 2 :(得分:0)

首先不能覆盖静态方法。 当引用静态方法或变量时,它将始终使用声明的类

的默认值
Subclass subclass=new Subclass();
    Superclass superclass=subclass;
    superclass.staticPrint();

不需要实例化静态方法。唯一重要的是超类声明为超类。

虽然实例方法总是引用其“实例”实现,因为实现依赖于对象的状态。

 Subclass subclass=new Subclass();
    Superclass superclass=subclass;
    superclass.staticPrint();
    superclass.print();

因为超类被实例化为子类。它将调用子类实现,因为实例方法需要执行一个状态。