我确定大家都知道我的意思-代码如下:
Thread thread = new Thread();
int activeCount = thread.activeCount();
引发编译器警告。为什么不是错误?
编辑:
需要明确的是:问题与线程无关。我意识到在讨论此问题时通常会给出线程示例,因为有可能将它们弄乱。但是,真正的问题在于,这种用法永远都是胡说八道,你不能(适当地)写这样的电话并表达自己的意思。这种方法调用的任何示例都是barmy。这是另一个:
String hello = "hello";
String number123AsString = hello.valueOf(123);
这使得每个String实例看起来都带有“ String valueOf(int i)”方法。
基本上,我相信Java设计人员在设计语言时犯了一个错误,并且由于涉及到兼容性问题,现在修复它为时已晚。是的,它可能导致非常误导的代码。是的,你应该避免这种情况。是的,你应该确保将IDE配置为将其视为错误,IMO。如果你曾经亲自设计过一种语言,请记住它作为避免这种情况的示例:)
只是为了回应DJClayworth的观点,这是C#所允许的:
public class Foo
{
public static void Bar()
{
}
}
public class Abc
{
public void Test()
{
// Static methods in the same class and base classes
// (and outer classes) are available, with no
// qualification
Def();
// Static methods in other classes are available via
// the class name
Foo.Bar();
Abc abc = new Abc();
// This would *not* be legal. It being legal has no benefit,
// and just allows misleading code
// abc.Def();
}
public static void Def()
{
}
}
为什么我会误导我?因为如果我看一下代码,someVariable.SomeMethod()
我希望它使用的值someVariable
。如果SomeMethod()
是静态方法,则该期望无效;代码欺骗了我。怎么能说有可能是一个很好的事情吗?
奇怪的是,Java不允许你使用可能未初始化的变量来调用静态方法,尽管事实上它将要使用的唯一信息是变量的声明类型。这是一个前后矛盾,毫无用处的混乱局面。为什么允许它?
编辑:此编辑是对Clayton答案的回应,声称它允许继承静态方法。没有。静态方法并不是多态的。这是一个简短但完整的程序,以证明这一点:
class Base
{
static void foo()
{
System.out.println("Base.foo()");
}
}
class Derived extends Base
{
static void foo()
{
System.out.println("Derived.foo()");
}
}
public class Test
{
public static void main(String[] args)
{
Base b = new Derived();
b.foo(); // Prints "Base.foo()"
b = null;
b.foo(); // Still prints "Base.foo()"
}
}
如你所见,的执行时间值b被完全忽略。
问题内容: 我指着一些窍门,发现了这一点。在以下代码中: 对象是。为什么这段代码没有抛出? 我知道这不是访问变量的正确方法,但问题在于。 问题答案: 如果要使用以下方法反汇编您的班级文件,请向当前答案中添加一些其他信息: 你会得到: 在这里,您可以看到该指令在第7行完成了对静态字段的访问。每当通过代码访问静态字段时,都会在程序文件中生成相应的指令。 指令具有特殊性,即它们不需要在调用它们之前就对要
问题内容: 对于有关辅助程序/实用程序类的这些简单问题,我从未找到好的答案: 为什么我要创建一个单例(无状态)而不使用静态方法? 如果对象没有状态,为什么需要一个对象实例? 问题答案: 通常,单例用于向应用程序引入某种 全局状态 。(说实话,通常不是很必要,但这是另一个话题。) 但是,在一些极端情况下,甚至 无状态 单例也可能有用: 您希望在可预见的将来用状态扩展它。 由于某些特定的 技术 原因,
问题内容: 在面向对象的范例中, 虚 函数或虚方法是一种函数或方法,其行为可以在继承类内被具有相同签名的函数覆盖以提供 多态行为 。 根据定义,除 final和private方法 外,Java中的每个非静态方法默认都是 虚拟 方法 。无法为 多态 行为继承的方法 不是 虚拟方法。 Java中的抽象类不过是等同于C ++的纯虚方法。 为什么我们说Java中的静态方法不是虚拟方法?即使我们可以重写静态
Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。
问题内容: 如果我用Java创建类的实例,为什么最好静态地调用同一类的静态方法,而不是使用this.method()? 当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告。 与 谁能解释为什么这是一件坏事?在我看来,编译器应该已经分配了对象的实例,因此静态分配内存将是不必要的开销。 编辑: 我听到的要点是,
编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?