有没有理由不能使用具有相同签名的静态和非静态方法?

时间:2017-03-22 11:20:29

标签: java overloading static-methods

我刚刚意识到以下内容无法编译:

class MyCoolClass {
    static void do(){..}
    void do(){..}
}

是否有充分理由不允许这样做?也许这会导致我目前遗漏的一些问题?

我目前唯一能看到的问题是有人可能会尝试调用静态方法并实际调用非静态方法。但这听起来与隐藏对方的子类上的静态方法相当,所以我不会认为"好的"原因。

如果考虑对象在该方法的第0个参数上调用一个方法,那么该方法的重载甚至会非常正常。

如果您想知道:我希望这样做,因为它可以为new MyCoolClass().do()创建MyCoolClass.do()的快捷方式,或者使用静态导入创建do()

2 个答案:

答案 0 :(得分:4)

这是因为Java编译器使用方法的名称和参数类型的有序列表来唯一地标识类中的方法。 static是修饰符标志,不被视为唯一标识的一部分。唯一标识在运行时也很重要,因为类文件仅包含标识方法所需的那些键。方法所在的类名,然后是方法名,然后是参数列表。

on Github

答案 1 :(得分:1)

我认为在创建对象时可能会遇到问题。您可能知道,您可以通过对象引用调用静态函数,如:

binSize * sampleSize

当然,通过对象调用静态方法很少见,但它是可能的。