猿问

为什么不通过实例调用静态方法是Java编译器的错误?

为什么不通过实例调用静态方法是Java编译器的错误?

我相信你们都知道我的意思-代码,比如:

Thread thread = new Thread();int activeCount = thread.activeCount();

引发编译器警告。为什么这不是一个错误?

编辑:

要明确一点:问题与线程无关。我意识到,在讨论这个问题时,经常会给出线程示例,因为它们可能会使事情变得一团糟。但真正的问题是这样的用法是胡说八道,你不能(胜任)写这样的电话,而且是认真的。这类方法调用的任何示例都是barmy。这里还有一个:

String hello = "hello";String number123AsString = hello.valueOf(123);

这使得每个字符串实例似乎都带有一个“Stringvalue(Inti)”方法。


回首忆惘然
浏览 522回答 3
3回答

Helenr

为什么要犯错误呢?实例可以访问所有静态方法。静态方法无法更改实例的状态(试图是编译错误)。您给出的著名示例的问题非常具体螺纹,而不是静态方法调用。看上去你好像activeCount()所引用的线程thread,但您确实得到了调用线程的计数。这是一个合乎逻辑的错误,你作为一个程序员正在犯。在这种情况下,发出警告是编译器应该做的事情。这取决于您是否注意到警告并修复您的代码。编辑:我意识到语言的语法是允许您可以编写具有误导性的代码,但请记住,编译器及其警告也是语言的一部分。该语言允许您做一些编译器认为可疑的事情,但它给出了警告,以确保您意识到它可能会导致问题。

米琪卡哇伊

他们不能再犯错误了,因为所有的代码都已经存在了。我同意你的意见,这应该是个错误。也许编译器应该有一个选项/概要文件来升级一些错误警告。最新情况:当他们引进断言关键字在1.4中,与旧代码具有类似的潜在兼容性问题,他们制作了它只有在将源模式显式设置为“1.4”时才可用..我想,在新的源模式“java 7”中,可能会出现错误。但我怀疑他们会这么做,因为这一切都会引起麻烦。正如其他人所指出的,严格来说,没有必要阻止您编写令人困惑的代码。对Java语言的更改应该限制在此时严格必要的范围内。
随时随地看视频慕课网APP

相关分类

Java
我要回答