在java中声明公共final方法是不是很糟糕

在java中声明公共final方法是不是很糟糕,java,Java,我想在基类中声明一个不能被子类覆盖的公共方法 将此方法声明为public final是否干净?有合法的理由需要方法final。基对象引用也可以指向派生类实例。因此,如果一个方法正在获取一个基类引用,它实际上可能指向一个DerivedFromBase对象 int SomeMethod(Base aBase) { ... double value = aBase.Calculate(a,b,c); ... } 如果派生类重写Calculate方法,使其操作方式不同于B

我想在基类中声明一个不能被子类覆盖的公共方法


将此方法声明为public final是否干净?

有合法的理由需要方法final。基对象引用也可以指向派生类实例。因此,如果一个方法正在获取一个基类引用,它实际上可能指向一个DerivedFromBase对象

int SomeMethod(Base aBase)
{
     ...
     double value = aBase.Calculate(a,b,c);
     ...
}
如果派生类重写Calculate方法,使其操作方式不同于Base的操作方式,则可能会导致SomeMethod行为不正确,因为它编写时希望Calculate的行为方式与Base实现它的方式相同


将Calculate方法设置为final可确保派生类不会更改Calculate方法的行为,从而确保无论传递的是基对象还是从基派生的任何对象,SomeMethod的行为都相同。

尽可能干净。最后一个修饰符声明方法或变量不能被子类化

来自维基百科

*

最后一个类不能被子类化。这样做可以带来安全和安全 效率优势,因此许多Java标准库类都是 final,例如java.lang.System和java.lang.String。所有方法在一个 final类是隐式final

*


一般来说,最好避免使用final,因为您可能会怀疑对象不会保持不变。

在Java B-)中声明任何方法都是不好的,不管它是否干净。这是做你想做的事情的唯一方法。这是一个广泛的问题,可以解释。如果可能的话,缩小问题的范围。是什么让你认为这不“干净”?你有什么特别的担心吗?这正是
final
的目的。为什么会这样呢?最后一个方法意味着它不能被重写——它并不意味着它没有被继承。在某些情况下,继承仍然是一件好事。:-)