考虑到以下几点,您可能会发现自己可以考虑将静态方法设为 final:
具有以下课程:
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
。这可能会让您感到惊讶,因为您实际上有一个 class 对象B
。但是由于您是从 type 的引用中调用它A
,所以它会调用A.ts()
. B
您可以使用以下代码打印:
A a = new B();
((B)a).ts();
在这两种情况下,您拥有的对象实际上都来自 class B
。但是根据指向对象的指针,您将调用 fromA
或 from方法B
。
现在假设您是类的开发人员,A
并且您希望允许子类化。但是你真的想要 method ts()
,无论何时调用,即使是从子类调用,也就是你想要它做的事情,而不是被子类版本隐藏。然后你可以制作它final
并防止它被隐藏在子类中。您可以确定以下代码将从您的类中调用该方法A
:
B b = new B();
b.ts();
好的,诚然这是以某种方式构建的,但在某些情况下可能是有意义的。
您不应该在实例上调用静态方法,而应直接在类上调用 - 这样您就不会遇到这个问题。例如,如果您在实例上调用静态方法以及将静态方法设为 final,IntelliJ IDEA 也会向您显示警告。