我是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";
}
}
答案 0 :(得分:12)
您无法在Java中覆盖静态方法。它只是直接在每个类上调用静态方法。顺便说一句:正如其他人所说,在实例上调用静态方法被认为是不好的做法。为清楚起见,您应该执行以下操作:
System.out.println(Tenor.sing() + " " + Singer.sing());
相当于您在问题中写的代码。
答案 1 :(得分:4)
t
的类型为Tenor
,s
的类型为Singer
。
当您在实例上调用静态方法时(这是一种不好的做法),您正在对声明类型的类调用静态方法。
即。 t.sing()
相当于Tenor.sing()
答案 2 :(得分:4)
应使用类名而不是对象引用来访问静态方法。你所写的正确等价物是:
System.out.println(Tenor.sing() + " " + Singer.sing())
Java 猜测根据 object 变量的类型推断你要调用哪个方法。
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)
你写的代码很好,但可能不是你想要的。静态方法不能在传统意义上(或您可能期望的行为)被覆盖。根据调用方法的哪个版本,这是在编译时完成的,这解释了您看到的输出。
是的,你应该只使用类名调用方法。