考虑以下因素,您可能会发现自己可以考虑将静态方法定为最终方法:
具有以下课程:
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
。但是,根据指向对象的指针,您将从A
或从调用方法B
。
现在,假设您是类的开发人员,A
并且想要允许子类化。但是,您真的想要method ts()
,无论何时从子类中调用它,这都是您想要的,并且不会被子类版本隐藏。然后,您可以制作它final
并防止它被隐藏在子类中。并且您可以确保以下代码将从您的类中调用该方法A
:
B b = new B();
b.ts();
好的,诚然,这是经过某种方式构造的,但在某些情况下可能有意义。
您不应在实例上调用静态方法,而应在类上直接调用-这样就不会有问题。另外,例如,如果您在实例上调用静态方法以及将静态方法定为最终方法,则IntelliJ IDEA也会向您显示警告。