我们不能覆盖基类的静态方法。
其实我尝试过这样的事情:
// 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并使用实例调用静态方法时,这些工作正常。那有什么区别?
答案 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意味着您正在子类中编写另一个静态方法,但不仅仅是重写基类方法。