为什么我们不能在派生类中覆盖静态方法

时间:2012-07-24 11:16:11

标签: java

  

可能重复:
  Can we override static method in Java?

我们不能覆盖基类的静态方法。

其实我尝试过这样的事情:

// Base class
public class StaticExampleImpl {
    protected String name="overriding";
    public static void display(){
        System.out.println("static method display : base class");
    }
}

然后派生类如下:

//derived class
public class StaticDemo extends StaticExampleImpl {
    // cannot override the static methods...
    //@Override
    public static void display(){
        System.out.println("child!!! static method display");
    }
    public static void main(String[] args) {
        StaticDemo d=new StaticDemo();
        d.display(); // derived class display is called rather than Base class.
    }
}

因此,当我取消注释@Override方法时,它会给出错误,因为“静态方法无法覆盖”。但通过评论,它运作正常。因此,当我们创建Objects并使用实例调用静态方法时,这些工作正常。那有什么区别?

8 个答案:

答案 0 :(得分:5)

因为静态方法不会被继承。

  

取消注释@Override时,表示您试图覆盖   静态方法,这是不可能的,这就是为什么你得到一个   错误。

     

但是当你评论//@Override时,这意味着你宣布一个新的   儿童班的方法。

答案 1 :(得分:1)

静态方法不属于类的实例,它属于实际的类。

当你致电d.display();时,你真的在​​调用StaticDemo d引用的静态方法的静态方法。

如果你这样做:

StaticExampleImpl d2 = new StaticDemo();d2.display(),你会发现它调用基类的显示。

但是,不要这样做。它导致令人困惑的代码,并且是一种糟糕的实现继承的方法。

答案 2 :(得分:1)

Overriding取决于类的实例。 polymorphism是您可以为类创建子类,并且实现这些subclasses的对象将对超类中定义的那些方法(以及子类中的overridden)具有不同的行为。static方法不属于类的实例,因此该概念不适用。

答案 3 :(得分:0)

无法继承静态方法。如果你想调用'base'类静态方法,你必须明确地调用StaticExampleImpl.display()

答案 4 :(得分:0)

静态方法绑定到类,它们不能被继承,这就是为什么在派生类中不能有基类静态方法。

答案 5 :(得分:0)

如果您尝试覆盖静态方法,则可能是您的设计出现了问题。

OOP和Polymorphism允许您执行以下操作:

public class MyClass1 {

   public String toString() { return "MyClass1 Instance"; }

}

public class MyClass2  extends MyClass1 {

   @Override
   public String toString() { return "MyClass1 Instance"; }

}

public void printSomething(MyClass1 myclass1){
      System.out.println(myclass1);
}

在printSomething中,将要调用的toString方法是myClass1的运行时类型:当你在printSomething中传入一个MyClass2的实例时,它的编译类型将是MyClass1,但它的运行时类型将是MyClass2 < / p>

很明显,要使用多态,您需要对象实例,其中实际的运行时类型可能与编译类型不同。然而,静态方法不属于任何对象实例,而属于类。你为什么不向我们解释你想要达到的目标?

答案 6 :(得分:0)

以下代码:

StaticExampleImpl one = new StaticExampleImpl();
StaticDemo two = new StaticDemo();
StaticExampleImpl three = two;

one.display();
two.display();
three.display();

将产生以下输出:

static method display : base class
child!!! static method display
static method display : base class

如您所见,该方法不会继承。这就是为什么它们被称为“静态方法”:它们被静态地调用,而不是动态调用,就像实例方法一样。类的编译时类型在调用静态方法时很重要,而不是运行时类型。

这也是您不应该通过对象实例调用静态方法的原因。总是这样打电话给他们:

StaticExampleImpl.display();
StaticDemo.display();

当人们期望继承为这些方法工作时,这完全消除了可能(将会)出现的混乱。

答案 7 :(得分:0)

java中的任何静态块,可能是静态变量,加载类时会加载方法。你可能知道java中的类加载器。所以事情是静态块(方法,变量或任何东西是静态的)加载一次。所以你实际上不能覆盖任何静态块。

注释@Override意味着您正在子类中编写另一个静态方法,但不仅仅是重写基类方法。