参考静态方法/从实例中的Java变量(Reference Static Methods/Variab

2019-07-18 09:09发布

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

提前致谢。

编辑:

特别是,我想咨询一下,当你有这样的事情

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

其中的getColor是RedShape类的静态方法。 这没有任何意义,这是允许的,不给编译器通过javac的命令行警告。 我看到它的“强烈反对”,但很好奇,如果有背后为什么它允许外部的技术或合理的理由“因为C ++允许它。”

Answer 1:

还有的实在没有理由你能真正做到这一点。

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

如果您尝试以下情形:

香蕉有一个名为“测试”(此打印“香蕉”)苹果香蕉延伸和“覆盖”静态方法叫“测试”(这版画“苹果”)的静态方法

和你做这样的事情:

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

所以有效,这是很没用。



Answer 2:

我看不出有什么毛病调用实例的静态方法。 这有什么错呢? 特别是,经常有这是一类的逻辑中是有用的,但实际上并不需要操作实例本身的方法。

反对通过调用实例引用一个静态方法。 经典范例:

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

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



Answer 3:

静态方法访问允许你在同一个类的实例之间共享价值观,甚至得到值,而不创建一个类实例所需。

有情况下,它的方便,没有OO语言冲突。



Answer 4:

我敢打赌,这是因为原来的设计师们从C ++移植能力,并通过时间20/20事后打击,这是一个向后兼容的问题。

也就是说,还是因为当你调用一个类中的方法,即使你没有前缀的一切this. 编译器将其插入(或等同物)包括用于静态方法。 如果静态方法不能从实例调用,然后套结this. 在前面可能有问题的(或将迫使程序员对静态方法前钉类的名字时,他们想要一个实际的实例中使用它们)。

总之,除非我们得到的早期语言开发人员回答一个问题的答案是投机性的。



Answer 5:

public class MyClass {
    public static String myString;
}


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

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



文章来源: Reference Static Methods/Variables in Java from an Instance