Java中的静态方法为啥不阻止实例对象调用

我猜测这种设定来自 C++ …

以下是 C++ 这么做的原因推测(纯属个人推测):
http://zh.cppreference.com/w/cpp/memory/allocator
http://zh.cppreference.com/w/cpp/concept/Allocator
C++ 标准库(或者说 STL ?)最早的分配器是无状态的,但为有状态分配器预留了位置。无状态分配器的非特殊成员函数最好都是 static 的;而有状态分配器的这些方法大多不能为 static ,而要关联到具体的分配器对象。
为了语法使用上统一(以简化 STL 设计),所以允许了类实例对象调用 static 方法。

■网友
好处是 多了一种产生BUG的途径!
这里有2个父子类 都提供了同一个静态方法
Java中的静态方法为啥不阻止实例对象调用

也许你的本意是输出2 毕竟new的是子类
但运行时 实际调用的方法是根据实例声明时的类型决定的
实际上会输出1 (其实从IDE上也可以看出来了
Java中的静态方法为啥不阻止实例对象调用

这里IDE已经提醒我们 这么做不好 然而编译器并不介意我们这么做
Java中的静态方法为啥不阻止实例对象调用

-----------------------------------
看看隔壁C#
Java中的静态方法为啥不阻止实例对象调用

严谨的微软!
-----------------------------------
可能唯一的好处就是
在类中的其他方法调用此静态方法时能少写几个字了

■网友
以前学c++的时候也觉得对象调静态是多余的,然而现在做c#却遇到了不能调用的麻烦。
我定义了一个泛型类
class A\u0026lt;T\u0026gt;{ static void foo1(){ …… } static void foo2(){ …… } ……}调用
void func(){ A\u0026lt;qwerTyuiOpasd\u0026gt;.foo1();//类名是乱写的,就是想表示实际中类名非常长 A\u0026lt;qwerTyuiOpasd\u0026gt;.foo2(); ……}虽然写这个类的时候就预想好了这么调用,但还是觉得挺麻烦的,今天突然想到,我可以用构造函数定死这个泛型,用对象调用静态方法。
var o = new A\u0026lt;qwerTyuiOpasd\u0026gt;();o.foo1();o.foo2();…… 【Java中的静态方法为啥不阻止实例对象调用】 可以说是非常舒服。当时没在做那个项目,想到就兴奋的不行,赶紧试了试。然而vs并不给编过我也是非常无奈。


    推荐阅读