使用最终方法创建抽象类有什么好处?

时间:2015-07-06 20:47:26

标签: java oop abstract-class final

我的意思是,显然,多态方面没有任何好处,

并将这些方法声明(全部)作为final将阻止我覆盖它们。 而且我知道可以这样做,编译器也不会阻止你这样做。

我很想得到一个用法示例......

4 个答案:

答案 0 :(得分:0)

有一些边缘情况,这种设计,如果可能不是最佳的,至少可以激发。例如,您可能有一个类系统,一个公共父类的所有子类,其中每个子类实现另一个接口。可能存在一组具有不同形式的接口,但具有相同的基本功能。

在这种特殊情况下,制作所有方法final并让每个子类添加自己的方法来使用它们都不会有害。

答案 1 :(得分:0)

我说它是"核心"的一部分。零件。你构建了一些东西,然后设计了这个架构,你就知道永远不应该改变那个方法。

答案 2 :(得分:0)

抽象类可以package访问一些内部方法。

在这种情况下,我们有

  • 不完整的课程
  • 功能必须保持不变并授予对内部模型的安全访问权限

这就是我们需要声明一个类型抽象及其所有方法final。举个例子来看一个Panel类来保存图形,但并不总是提供一种方法来实际绘制它自己 - 子类可以有不同的绘图行为。另一方面,它可以提供final protected DrawBuffer makeCircle()或类似的东西,出于某种原因,必须访问内部模型才能生成DrawBuffer

答案 3 :(得分:0)

当某些方法以这种方式声明时,当它无法被覆盖时,JIT可以获益。 (静态,私人,最终,在最后一堂课)

让我们想象你有课程:

abstract class A {
     public void doSomething() {
         // default and only realization;
     }
}

class B extends A { ... }

然后你写下这样的话:

A a = MyAFactory.createA();
a.doSomething();

当无法知道方法是 final 时,有可能(即使刚刚加载)覆盖,编译器会调用第二行来调用虚方法。即首先,它将确定哪个类恰好是A类,然后查看虚方法表,然后才调用特定方法。

但是!如果方法已知,因为它无法被覆盖,那么编译器可以直接调用A.doSomething()。

因此,除非您需要覆盖它们,否则建议将方法设为final。

让我们想象一下这样的课程:

abstract class C {

    public abstract int getMin();

    public abstract int getMax();

    public final int getSize() {
        return getMax() - getMin();
    }

}

在这个例子中,很明显是getSize()的行为,很难想象它何时需要更改。因此,声明它是最终的,不仅通过放弃虚拟调用机制提供了好处,而且还防止了具有特定和预定义行为的方法的意外覆盖。