考虑到以下几点,您可能会发现自己可以考虑将静态方法设为 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 也会向您显示警告。