0

Possible Duplicate:
Can we override static method in Java?

We cannot override the static methods of the base class.

Actually I tried something like this:

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

Then the derived class is as follows:

//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.
    }
}

So, when I uncomment the @Override method, it gives error as "Static methods cannot be overriden". But with commenting it works fine. So, when we create the Objects and call the static methods with the instances, those work fine. so what is the difference??

4

8 回答 8

5

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

当您取消注释@Override时,这意味着您正在尝试覆盖静态方法,这是不可能的,这就是您收到错误的原因。

但是当您发表评论时,//@Override这意味着您正在子类中声明一个新方法。

于 2012-07-24T11:17:49.390 回答
1

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

于 2012-07-24T11:48:57.650 回答
1

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

当您调用 时d.display();,您实际上是在调用StaticDemo d 引用的静态方法的静态方法。

如果你这样做了:

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

但是,不要这样做。它会导致代码混乱,并且是一种糟糕的继承实现方式。

于 2012-07-24T11:21:49.860 回答
0

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

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

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

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

于 2012-07-24T11:25:00.937 回答
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();

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

于 2012-07-24T11:25:24.103 回答
0

静态方法绑定到无法继承的类,这就是为什么派生类中不能有基类静态方法的原因。

于 2012-07-24T11:22:01.733 回答
0

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

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

于 2012-07-24T11:27:46.497 回答
0

静态方法不能被继承。如果要调用“基”类静态方法,则必须显式调用StaticExampleImpl.display().

于 2012-07-24T11:21:15.630 回答