任何人都可以向我解释为什么Java允许您访问从一个实例的静态方法和成员? 一个坏榜样,如果我有一个名为RedShape类,它呼吁的getColor()返回“红”,为什么java的允许您调用从RedShape实例的静态方法静态方法? 对我来说这似乎违背了一些OO语言设计的核心概念。 至少,它应该有一个编译器警告。
提前致谢。
编辑:
特别是,我想咨询一下,当你有这样的事情
RedShape test = new RedShape();
test.getColor();
其中的getColor是RedShape类的静态方法。 这没有任何意义,这是允许的,不给编译器通过javac的命令行警告。 我看到它的“强烈反对”,但很好奇,如果有背后为什么它允许外部的技术或合理的理由“因为C ++允许它。”
还有的实在没有理由你能真正做到这一点。
我唯一的猜测是,它会允许您重写静态方法,但你不能 。
如果您尝试以下情形:
香蕉有一个名为“测试”(此打印“香蕉”)苹果香蕉延伸和“覆盖”静态方法叫“测试”(这版画“苹果”)的静态方法
和你做这样的事情:
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 ++移植能力,并通过时间20/20事后打击,这是一个向后兼容的问题。
也就是说,还是因为当你调用一个类中的方法,即使你没有前缀的一切this.
编译器将其插入(或等同物)包括用于静态方法。 如果静态方法不能从实例调用,然后套结this.
在前面可能有问题的(或将迫使程序员对静态方法前钉类的名字时,他们想要一个实际的实例中使用它们)。
总之,除非我们得到的早期语言开发人员回答一个问题的答案是投机性的。
public class MyClass {
public static String myString;
}
public class AnotherClass {
public void doSomething() {
doAnotherThing();
}
public static doAnotherThing() {
MyClass.myString = "something";
}
在这里,我们从非静态方法(间接地)通过调用从非静态方法静态方法访问静态变量。