如果我用Java创建一个类的实例,为什么最好静态地调用同一个类的静态方法,而不是使用this.method()?
当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告。
public MyClass() { this.staticMethod(); }
VS
public MyClass() { MyClass.staticMethod(); }
任何人都可以解释为什么这是一件坏事吗?在我看来,编译器应该已经分配了一个对象的实例,因此静态分配内存将不需要开销。
编辑:
我听到的要点是,这是不好的做法,主要是因为可读性,这是可以理解的。我真正想要问的是(尽管不是很清楚)在调用MyClass.staticMethod()或this.staticMethod()之间的'编译'有什么不同之处。
答案 0 :(得分:11)
静态方法与类的实例无关,因此从this
调用它比从Class.staticMethod()
调用它更不合理,更多也是可读的。
答案 1 :(得分:6)
MyClass.staticMethod()清楚地表明您正在调用静态(不可重写)方法。
this.staticMethod()误导读者认为它是一个实例方法。
staticMethod()也在误导方面(虽然我通常这样做)。
如果您认为人们在阅读您的代码时不熟悉它,您倾向于尝试使代码更清晰,这是通过使用ClassName.method而不是instance.method来更清楚代码的情况。
答案 2 :(得分:5)
除了提到的其他答案明确表示你使用的是静态方法之外,还要注意静态方法不是多态的,因此使用类名显式可以消除任何关于哪种方法的混淆。被称为。
在下面的代码中,如果你期望非静态方法的多态性,b.test()
将返回“A”并不是很明显:
public class TestStaticOverride
{
public static void main( String[] args )
{
A b = new B();
System.out.println( "Calling b.test(): " + b.test() );
}
private static class A
{
public static String test() { return "A"; }
}
private static class B extends A
{
public static String test() { return "B"; }
}
}
如果您将代码更改为B b = new B();
,则会打印出“B”。
(“覆盖”静态方法是否一个好主意可能是另一天的讨论......)
答案 3 :(得分:3)
静态方法实际上不是你的实例的一部分 - 它无论如何都无法访问你的任何实例变量,所以我敢认为从构造函数中调用它并没有多大意义。
如果需要初始化静态对象,请使用
private static List l = new ArrayList(); static { l.add("something"); }
如果你仍然需要调用它,那么调用本地静态方法就没有前缀你的本地类名,就像这样(没有日食警告)
public MyClass() { staticMethod(); }
答案 4 :(得分:2)
因为this.
通常引用实例方法,所以这样做是个坏主意。