[英]Static Methods in 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";
}
}
您无法在Java中覆盖静态方法。 它只是直接在每个类上调用静态方法。 顺便说一句:正如其他人所说,在实例上调用静态方法被认为是不好的做法。 为清楚起见,您应该执行以下操作:
System.out.println(Tenor.sing() + " " + Singer.sing());
这相当于你在问题中写的代码。
t
是Tenor
类型, s
是Singer
类型。
当您在实例上调用静态方法时(这是一种不好的做法),您将在声明的类型的类上调用静态方法。
即t.sing()
相当于Tenor.sing()
应使用类名而不是对象引用来访问静态方法。 你所写的正确等价物是:
System.out.println(Tenor.sing() + " " + Singer.sing())
Java 猜测根据对象变量的类型推断你要调用哪个方法。
编辑:斯蒂芬指出,这不是猜测。 推断可能是一个更准确的词。 我只是想强调在对象引用上调用静态函数可能会导致您不期望的行为。 事实上,我只是尝试了一些事情并发现我之前的陈述不正确:Java根据变量类型决定调用哪个方法。 现在这很明显,我想的更多,但我可以看到如果你做了类似的事情,它会如何导致混乱:
Singer s = new Tenor();
System.out.println(s.sing());
静态方法不会被覆盖。 它们属于定义它们的类。 在该方法的实例上调用静态方法的方式与在类上调用它的方式相同,但会使事情变得不那么清晰,并导致人们认为它们像实例方法一样被覆盖。
静态方法无法覆盖。
以下资源将帮助您更好地了解在尝试覆盖静态方法时发生的情况:
http://www.javabeat.net/qna/49-can-we-override-static-methods-what-is-metho/
此致,西里尔
你写的代码很好,但可能不是你想要的。 静态方法不能在传统意义上(或您可能期望的行为)被覆盖。 就调用哪个版本的方法而言,这是在编译时完成的,这解释了您看到的输出。
是的,您应该只使用类名调用方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.