我可以在Java中覆盖和重载静态方法吗?

gir*_*iri 58 java static overriding overloading

我想知道:

  1. 为什么不能在Java中覆盖静态方法?
  2. Java中是否可以重载静态方法?

ope*_*sas 77

静态方法不能在单词的确切意义上被覆盖,但它们可以隐藏父静态方法

在实践中,这意味着que编译器将决定在编译时执行哪个方法,而不是在运行时,就像重写实例方法一样.

有一个简洁的例子,请看这里.

是Java文档解释之间的区别重写实例方法和隐藏的类(静态)方法.

覆盖:在Java中覆盖只是意味着将根据对象的运行时类型调用特定方法,而不是根据它的编译时类型调用(覆盖静态方法的情况)

隐藏:静态的父类方法不是子类的一部分(尽管它们是可访问的),因此不存在覆盖它的问题.即使您在子类中添加另一个静态方法,与其父类中的静态方法相同,此子类静态方法也是唯一的,并且与其父类中的静态方法不同.

  • 谢谢,您的链接帮助我找到答案.我在你给的链接阅读:"使用Java语言重写仅仅意味着特定的方法将基于对象的运行时类型,而不是它的编译时类型(这是与被覆盖的静态方法的情况下)被调用. " 这是我正在寻找的答案.谢谢. (2认同)
  • 我在 [CodeRanch](http://www.coderanch.com/how-to/java/OverridingVsHiding) 上找到了更深入的解释 (2认同)
  • 为了真正完成这个答案,您可能应该回答问题的第二部分。 (2认同)

Vol*_*eam 25

静态方法不能被覆盖,因为没有什么可以覆盖,因为它们是两种不同的方法.例如

static class Class1 {
    public static int Method1(){
          return 0;
    }
}
static class Class2 extends Class1 {
    public static int Method1(){
          return 1;
    }

}
public static class Main {
    public static void main(String[] args){
          //Must explicitly chose Method1 from Class1 or Class2
          Class1.Method1();
          Class2.Method1();
    }
}
Run Code Online (Sandbox Code Playgroud)

是的静态方法可以像任何其他方法一样重载.

  • 静态方法不需要重写任何内容,因为静态方法是在编译时链接的,这与普通方法不同,普通方法的执行是在运行时确定的。您不能期望 `c1.Method1()` 和 `c2.Method1()` 调用同一个函数,事实上,编译器警告您以这种方式调用静态函数不是明智之举。 (3认同)
  • 你能更详细地说明**静态方法不能被覆盖,因为没有什么可以覆盖**吗?这样做时有人会得到什么: Class1 c1 = new Class2(); Class2 c2 = new Class2(); 我是否希望 Class2 中的 Method1() 在这两种情况下都被调用? (2认同)

Thi*_*ilo 10

无法覆盖静态方法,因为它们在运行时未在对象实例上调度.编译器决定调用哪个方法.

这就是您在编写时收到编译器警告的原因

 MyClass myObject = new MyClass();
 myObject.myStaticMethod();
 // should be written as
 MyClass.myStaticMethod()
 // because it is not dispatched on myObject
 myObject = new MySubClass();
 myObject.myStaticMethod(); 
 // still calls the static method in MyClass, NOT in MySubClass
Run Code Online (Sandbox Code Playgroud)

静态方法可以重载(意味着只要它们具有不同的参数类型,您可以为多个方法使用相同的方法名称).

 Integer.parseInt("10");
 Integer.parseInt("AA", 16);
Run Code Online (Sandbox Code Playgroud)


Kum*_*ish 6

静态的父类方法不是子类的一部分(尽管它们是可访问的),因此不存在覆盖它的问题.即使您在子类中添加另一个静态方法,与其父类中的静态方法相同,此子类静态方法也是唯一的,并且与其父类中的静态方法不同.


小智 5

静态方法不能被覆盖,因为它们不是对象状态的一部分。相反,它们属于类(即它们是类方法)。可以重载静态(和最终)方法。