Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 只使用final方法创建抽象类的好处是什么?_Java_Oop_Abstract Class_Final - Fatal编程技术网

Java 只使用final方法创建抽象类的好处是什么?

Java 只使用final方法创建抽象类的好处是什么?,java,oop,abstract-class,final,Java,Oop,Abstract Class,Final,我的意思是,很明显,多态性方面没有好处 将(所有)这些方法声明为final将阻止我重写它们。 我知道这是可能的,编译器不会阻止你这么做 我很想得到一个使用示例…在一些边缘情况下,这样的设计,如果可能不是最佳的,至少可以被激发。例如,您可能有一个类系统,一个公共父类的所有子类,其中每个子类实现另一个接口。可能有一组具有不同形式但基本功能相同的接口 在这种特殊情况下,将所有的方法都设置为final,并让每个子类添加自己的使用它们的方法是没有坏处的。在一些边缘情况下,这样的设计,如果可能不是最优的,至

我的意思是,很明显,多态性方面没有好处

将(所有)这些方法声明为final将阻止我重写它们。 我知道这是可能的,编译器不会阻止你这么做


我很想得到一个使用示例…

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


在这种特殊情况下,将所有的方法都设置为final,并让每个子类添加自己的使用它们的方法是没有坏处的。

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


在这种特殊情况下,将所有的方法都设置为final,并让每个子类添加自己的方法来使用它们是没有坏处的。

我认为它是“核心”组件的一部分。你构建了一些东西,设计了架构,你知道这种方法永远不应该改变。

我认为它是“核心”组件的一部分。您构建了一些东西并设计了体系结构,您知道该方法永远不应该更改。

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

在这种情况下,我们有

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

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

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

在这种情况下,我们有

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

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

当某些方法以这种方式声明时,JIT可以从中受益,而不能被重写。(静态、私有、最终、最终类)

让我们假设您有课程:

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

class B extends A { ... }
然后你写下这样的话:

A a = MyAFactory.createA();
a.doSomething();
当无法知道该方法是最终方法,并且存在可能的(即使刚才并没有加载)重写时,编译器会在第二行调用虚拟方法。也就是说,首先它将确定到底是哪个类,然后在虚拟方法表中查找,然后才调用特定的方法

但是!若方法被称为“无法重写”,那个么编译器可以在此点直接调用A.doSomething()

因此,建议将方法设为final,除非需要重写它们

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

abstract class C {

    public abstract int getMin();

    public abstract int getMax();

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

}

在本例中,getSize()的行为显而易见,很难想象何时需要更改它。因此,将其声明为final,不仅可以通过放弃虚拟调用机制提供好处,而且还可以防止使用特定的预定义行为对方法进行意外重写。

当某些方法以这种方式声明时,JIT可以从中受益,但无法重写。(静态、私有、最终、最终类)

让我们假设您有课程:

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

class B extends A { ... }
然后你写下这样的话:

A a = MyAFactory.createA();
a.doSomething();
当无法知道该方法是最终方法,并且存在可能的(即使刚才并没有加载)重写时,编译器会在第二行调用虚拟方法。也就是说,首先它将确定到底是哪个类,然后在虚拟方法表中查找,然后才调用特定的方法

但是!若方法被称为“无法重写”,那个么编译器可以在此点直接调用A.doSomething()

因此,建议将方法设为final,除非需要重写它们

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

abstract class C {

    public abstract int getMin();

    public abstract int getMax();

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

}

在本例中,getSize()的行为显而易见,很难想象何时需要更改它。因此,将其声明为final,不仅可以通过放弃虚拟调用机制提供好处,还可以通过特定的预定义行为防止意外重写方法。

我不确定是否有这样的好处。您为什么认为有这样的好处?只是编译器允许你这么做?编译器可以让你做很多无用的事情
publicstaticvoidmain(String[]args){throw newruntimeexception(“无用”);}
可能是您真正想要的基类不能直接实例化,但不需要任何抽象方法。不寻常但耸耸肩。你能给我们举个例子吗?我不确定有没有。你怎么认为有好处?只是编译器允许你这么做?编译器可以让你做很多无用的事情
publicstaticvoidmain(String[]args){throw newruntimeexception(“无用”);}
可以是您真正的