Grundsätzlich glaube ich, dass die Java-Entwickler einen Fehler gemacht haben, als sie die Sprache entworfen haben, und es ist zu spät, um es aufgrund der Kompatibilitätsprobleme zu beheben. Ja, es kann zu sehr irreführendem Code führen. Ja, du solltest es vermeiden. Ja, Sie sollten sicherstellen, dass Ihre IDE so konfiguriert ist, dass sie als Fehler, IMO, behandelt wird. Sollten Sie jemals eine Sprache entwickeln sich, tragen sie im Sinn, als ein Beispiel für die Art der Sache zu vermeiden :)
Nur um DJClayworth der Punkt zu antworten, hier ist was in C# erlaubt ist:
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()
{
}
}
Warum tun Ich denke, es ist irreführend? Denn wenn ich mir Code someVariable.SomeMethod()
anschaue, erwarte ich, dass er den Wert someVariable
verwendet. Wenn eine statische Methode ist, ist diese Erwartung ungültig. Der Code trickst mich. Wie kann das eine gute Sache sein?
Seltsamerweise wird Java nicht zulassen, dass Sie eine potenziell nicht initialisierte Variable verwenden, um eine statische Methode aufzurufen, obwohl die einzige Information, die sie verwenden wird, der deklarierte Typ der Variablen ist. Es ist ein widersprüchliches und wenig hilfreiches Durcheinander. Warum erlauben Sie es?
EDIT: Diese Änderung ist eine Antwort auf Clayton's Antwort, die behauptet, dass Vererbung für statische Methoden ermöglicht. Es tut es nicht. Statische Methoden sind nicht polymorph. Hier ist ein kurzes, aber vollständiges Programm zu demonstrieren, dass:
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()"
}
}
Wie Sie sehen können, der Ausführungszeitwert von b
wird völlig ignoriert.
Um auf Ihren Punkt zu erweitern, kann die redundante Instanz sogar null sein: 'String hallo = null; hallo.valueOf (123); 'funktioniert! – Thilo