基本上,我相信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
的值。如果 是静态方法,则该期望无效;代码欺骗了我。这怎么可能是一件好事呢?someVariable.SomeMethod()
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