Java 只使用final方法创建抽象类的好处是什么?
我的意思是,很明显,多态性方面没有好处 将(所有)这些方法声明为final将阻止我重写它们。 我知道这是可能的,编译器不会阻止你这么做Java 只使用final方法创建抽象类的好处是什么?,java,oop,abstract-class,final,Java,Oop,Abstract Class,Final,我的意思是,很明显,多态性方面没有好处 将(所有)这些方法声明为final将阻止我重写它们。 我知道这是可能的,编译器不会阻止你这么做 我很想得到一个使用示例…在一些边缘情况下,这样的设计,如果可能不是最佳的,至少可以被激发。例如,您可能有一个类系统,一个公共父类的所有子类,其中每个子类实现另一个接口。可能有一组具有不同形式但基本功能相同的接口 在这种特殊情况下,将所有的方法都设置为final,并让每个子类添加自己的使用它们的方法是没有坏处的。在一些边缘情况下,这样的设计,如果可能不是最优的,至
我很想得到一个使用示例…在一些边缘情况下,这样的设计,如果可能不是最佳的,至少可以被激发。例如,您可能有一个类系统,一个公共父类的所有子类,其中每个子类实现另一个接口。可能有一组具有不同形式但基本功能相同的接口
在这种特殊情况下,将所有的方法都设置为final,并让每个子类添加自己的使用它们的方法是没有坏处的。在一些边缘情况下,这样的设计,如果可能不是最优的,至少可以被激发。例如,您可能有一个类系统,一个公共父类的所有子类,其中每个子类实现另一个接口。可能有一组具有不同形式但基本功能相同的接口
在这种特殊情况下,将所有的方法都设置为final,并让每个子类添加自己的方法来使用它们是没有坏处的。我认为它是“核心”组件的一部分。你构建了一些东西,设计了架构,你知道这种方法永远不应该改变。我认为它是“核心”组件的一部分。您构建了一些东西并设计了体系结构,您知道该方法永远不应该更改。抽象类可以访问一些内部方法 在这种情况下,我们有
- 不完整的课程
- 功能必须保持不变,并授予对内部模型的安全访问权限
这就是我们所需要声明的类型抽象及其所有方法
final
。考虑一个例子:最终保护的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(“无用”);}
可以是您真正的