你可能会发现自己在考虑制作一个静态方法,最后,考虑到以下位置:
具有以下类:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
现在的“正确”的方式来调用这些方法将
A.ts();
B.ts();
这将导致AB
但你也可以致电实例方法:
A a = new A();
a.ts();
B b = new B();
b.ts();
这也会导致AB
。
现在考虑以下几点:
A a = new B();
a.ts();
,将打印A
。这可能会让你感到惊讶,因为你实际上有一个类B
的对象。但是,由于您是从A
类型的参考调用它,它将调用A.ts()
。你可以用下面的代码打印B
:
A a = new B();
((B)a).ts();
在这两种情况下,你有对象实际上是从B
类。但取决于指向该对象的指针,您将调用方法A
或B
。
现在我们假设您是A
类的开发人员,并且您希望允许子分类。但是,无论何时调用,即使是从子类中调用,您都确实想要方法ts()
,这是做你想做的事情,而不是被子类版本隐藏。那么你可以使它成为final
,并防止它被隐藏在子类中。你可以肯定的是,下面的代码将调用该方法从A
类:
B b = new B();
b.ts();
好吧,admittetly以某种方式建造,但它可能是有意义的一些情况。
你不应该在实例上调用静态方法,而是直接调用类 - 那么你就不会有这个问题。例如,如果你在一个实例上调用一个静态方法,以及如果你最终创建一个静态方法,那么IntelliJ IDEA会向你显示警告。
它似乎很奇怪,这个问题的+1,但直到现在,没有一个答案是令人满意的。 – 2009-11-16 17:54:59
它没有被覆盖。它仍然在A.ts()。 – 2009-11-16 18:03:09