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

时间:2009-09-17 16:14:13

标签: java static instance

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

提前致谢。

编辑:

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

的东西
RedShape test = new RedShape();
test.getColor();

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

5 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:3)

你真的没有理由这么做。

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

如果您尝试以下方案:

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

如此有效,它毫无用处。

答案 2 :(得分:0)

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

有些情况下方便且没有OO语言违规。

答案 3 :(得分:0)

我敢打赌,因为最初的设计师正在使用C ++移植功能,到20/20后见之明,这是一个向后兼容问题。

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

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

答案 4 :(得分:0)

public class MyClass {
    public static String myString;
}


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

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