从实例引用Java中的静态方法/变量

任何人都可以向我解释为什么java允许您从实例访问静态方法和成员? 一个不好的例子,如果我有一个名为RedShape的对象并且它有一个名为getColor()的静态方法返回“red”,为什么java允许你从RedShape实例调用静态方法? 对我来说,这似乎违反了OO语言设计的一些核心概念。 至少,它应该带有编译器警告。

提前致谢。

编辑:

特别是,我问你什么时候有类似的东西

RedShape test = new RedShape(); test.getColor(); 

其中getColor是RedShape类的静态方法。 这没有任何意义,它是允许的,并没有通过javac在命令行上给出编译器警告。 我看到它“强烈气馁”,但很奇怪是否有一个技术或合理的理由背后为什么它被允许在“因为C ++允许它”之外。

你真的没有理由这么做。

我唯一的猜测是,它允许你覆盖静态方法,但你不能

如果您尝试以下方案:

Banana有一个名为’test’的静态方法(打印’香蕉’)Apple扩展Banana并“覆盖”名为’test’的静态方法(打印’apple’)

你做这样的事情:

 public static void main(String[] args) { Apple apple = new Apple(); Banana banana = new Banana(); Banana base = new Apple(); apple.test(); banana.test(); base.test(); } 

结果输出是:

 apple banana banana 

如此有效,它毫无用处。

实例调用静态方法我没有看到任何问题。 这有什么问题? 特别是,通常有一些方法在类的逻辑中很有用,但实际上并不需要操作实例本身。

我反对通过实例引用调用静态方法。 经典例子:

 Thread thread = new Thread(...); thread.sleep(5000); // Doesn't do what it looks like 

这在一些IDE中带有编译器警告 – 当然在Eclipse中,假设你打开它。 (Java /编译器/错误和警告/代码样式/对静态成员的非静态访问。)我个人认为Java的设计存在错误。 (这是C#设法避免复制的错误之一。)

对静态方法的访问允许您在同一个类的实例之间共享值,甚至可以在不需要创建类实例的情况下获取值。

有些情况下它很方便,没有OO语言违规。

我打赌这是因为原始设计师正在从C ++移植function,到20/20后见之明时,这是一个向后兼容性问题。

那个,或者因为当你在一个类中调用一个方法时,即使你不必用this.为所有内容加前缀this. 编译器插入(或等效)包括静态方法。 如果无法从实例调用静态方法,那么解决this. 在前面可能是一个问题(或者只要他们想在实际实例中使用它们,就会迫使编码人员在静态方法的前面添加类名)。

无论如何,除非我们让一位早期语言开发人员回答,否则答案是推测性的。

 public class MyClass { public static String myString; } public class AnotherClass { public void doSomething() { doAnotherThing(); } public static doAnotherThing() { MyClass.myString = "something"; } 

这里我们通过从非静态方法调用静态方法从非静态方法(间接)访问静态变量。