2010-04-23 59 views
5

如果我用Java创建一个类的实例,为什么最好是静态调用同一个类的静态方法,而不是使用this.method()?为什么最好从方法的类的实例中静态地调用静态方法?

当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我从Eclipse获得警告。

public MyClass() { this.staticMethod(); } 

VS

public MyClass() { MyClass.staticMethod(); } 

任何人都可以解释为什么这是一个糟糕的事是什么?在我看来,编译器应该已经分配了对象的一个​​实例,所以静态分配内存将是不必要的开销。

编辑:

什么,我听到的要点是,这是不好的做法,主要是因为可读性的,也是可以理解的。我真正想要问的是(虽然不是很清楚)是在调用MyClass.staticMethod()或this.staticMethod()之间有什么区别。

回答

6

MyClass.staticMethod()清楚地表明您正在调用静态(不可重写)方法。

this.staticMethod()误导读者认为它是一种实例方法。

staticMethod()也是误导性的一面(尽管我通常这样做)。

如果你认为读取你的代码的人不熟悉它,你会试图使代码更清晰,并且通过使用ClassName.method而不是instance.method代码更加清晰。

2

由于this.通常引用实例方法,因此,这是一个坏主意。

11

静态方法不依赖于类的一个实例,所以意义不大从this调用它,而不是从Class.staticMethod()打电话,更可读了。

3

静态方法实际上不是你的实例的一部分 - 它无论如何都不能访问任何实例变量,所以我敢想它从构造函数中调用它并没有多大意义。

如果您需要初始化静态对象使用

private static List l = new ArrayList(); static { l.add("something"); } 

如果您仍然需要调用它的完全合法的调用本地静态方法没有前缀的本地类的名​​字,像这样(没有日食警告)

public MyClass() { staticMethod(); } 
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”。

(无论是以往任何时候都“越权”静态方法可能是另一天的讨论......是个好主意)

+0

不重写静态方法,你隐藏起来。覆盖意味着多态性,这是静态方法所不具备的。 – TofuBeer 2010-04-23 03:59:18

+0

@TofuBeer谢谢,我的术语不够精确。从某人在静态方法中使用'this'的角度来看,这可能意味着某种形式的多态性意图,而这种意图不起作用。 – Ash 2010-04-23 04:16:11

相关问题