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

Bri*_*den 4 java static instance

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

提前致谢.

编辑:

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

RedShape test = new RedShape();
test.getColor();
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 9

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

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

Thread thread = new Thread(...);
thread.sleep(5000); // Doesn't do what it looks like
Run Code Online (Sandbox Code Playgroud)

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

  • @Tom Hawtin:没错。该代码并没有做它看起来会做的事情。 (3认同)

Mal*_*eur 3

实际上没有理由可以这样做。

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

如果您尝试以下场景:

Banana 有一个名为“test”的静态方法(这会打印“banana”) 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();
}
Run Code Online (Sandbox Code Playgroud)

结果输出是:

apple
banana
banana
Run Code Online (Sandbox Code Playgroud)

这么有效,其实没什么用。