Java中的静态方法

时间:2011-04-08 02:42:20

标签: java

我是Java编程的新手。任何人都可以解释我为什么程序输出 - “fa la”即使静态方法被覆盖。我读过静态方法不能在Java中重写?如果我错了,请纠正我。

public class Tenor extends Singer {  
   public static String sing() {   
      return "fa";   
   }  
   public static void main(String[] args) {  
      Tenor t = new Tenor();  
      Singer s = new Tenor();  
      System.out.println(t.sing() + " " + s.sing());  
  }  
 }  
class Singer {   
   public static String sing() {   
       return "la";   
    }   
}  

6 个答案:

答案 0 :(得分:12)

您无法在Java中覆盖静态方法。它只是直接在每个类上调用静态方法。顺便说一句:正如其他人所说,在实例上调用静态方法被认为是不好的做法。为清楚起见,您应该执行以下操作:

System.out.println(Tenor.sing() + " " + Singer.sing());

相当于您在问题中写的代码。

答案 1 :(得分:4)

t的类型为Tenors的类型为Singer

当您在实例上调用静态方法时(这是一种不好的做法),您正在对声明类型的类调用静态方法。

即。 t.sing()相当于Tenor.sing()

答案 2 :(得分:4)

应使用类名而不是对象引用来访问静态方法。你所写的正确等价物是:

System.out.println(Tenor.sing() + " " + Singer.sing())

Java 猜测根据 object 变量的类型推断你要调用哪个方法。

编辑:斯蒂芬指出,这不是猜测。推断可能是一个更准确的词。我只是想强调在对象引用上调用静态函数可能会导致您不期望的行为。事实上,我只是尝试了一些事情并发现我之前的陈述不正确:Java根据变量类型决定调用哪个方法。现在这很明显,我想的更多,但我可以看到,如果你做了类似的话,它会如何导致混淆:

Singer s = new Tenor();
System.out.println(s.sing());

答案 3 :(得分:2)

静态方法重写。它们属于定义它们的类。在该方法的实例上调用静态方法的方式与在类上调用它的方式相同,但会使事情变得不那么清晰,并导致人们认为它们像实例方法一样被覆盖。

答案 4 :(得分:2)

无法覆盖静态方法。

以下资源将帮助您更好地了解在尝试覆盖静态方法时发生的情况:

http://www.javabeat.net/qna/49-can-we-override-static-methods-what-is-metho/

此致 西里尔

答案 5 :(得分:0)

你写的代码很好,但可能不是你想要的。静态方法不能在传统意义上(或您可能期望的行为)被覆盖。根据调用方法的哪个版本,这是在编译时完成的,这解释了您看到的输出。

是的,你应该只使用类名调用方法。