抽象类可以有最终方法吗?

key*_*yur 3 java abstract-class final

抽象类可以在Java中使用最终方法吗?

Bil*_*ard 39

当然.看一下示例的Template方法模式.

abstract class Game
{
    protected int playersCount;

    abstract void initializeGame();

    abstract void makePlay(int player);

    abstract boolean endOfGame();

    abstract void printWinner();

    /* A template method : */
    final void playOneGame(int playersCount) {
        this.playersCount = playersCount;
        initializeGame();
        int j = 0;
        while (!endOfGame()) {
            makePlay(j);
            j = (j + 1) % playersCount;
        }
        printWinner();
    }
}
Run Code Online (Sandbox Code Playgroud)

扩展的类Game仍然需要实现所有抽象方法,但它们无法扩展,playOneGame因为它被声明为final.

抽象类也可以包含既不是抽象也不是最终的方法,只是常规方法.这些方法必须在抽象类中实现,但是由实现者来决定扩展类是否需要覆盖它们.


Mne*_*nth 6

是的,它可以.但是最终的方法本身不能是抽象的(同一类中的其他非最终方法也可以).


sia*_*ian 5

是的,“抽象”类中可能有“最终”方法。但是,类中的任何“抽象”方法都不能声明为 final。它会给出“修饰符的非法组合:抽象和最终”错误。

public abstract final void show();
    illegal combination of modifiers: abstract and final
Run Code Online (Sandbox Code Playgroud)

这是实现的工作示例。

abstract class Sian                 //ABSTRACT CLASS
{
    public final void show()        // FINAL METHOD
    {
         System.out.println("Yes");
    }
    public void display()
    {
         System.out.println("Overriding");
    }
    public abstract void success();
}
class Ideone extends Sian               //INHERTING ABSTRACT CLASS
{
    public void display()
    {
        System.out.println("Overridden");
    }
    public void success()               //OVERRIDING THE ABSTRACT METHOD
    {
        System.out.println("Success overriding");
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        Ideone id = new Ideone();       //OBJECT OF SUBCLASS
        id.show();                      //CALLING FINAL METHOD
        id.display();                   //OVERRIDDEN METHODS
        id.success();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:-

Yes
Overridden
Success overriding
Run Code Online (Sandbox Code Playgroud)

这是 ideone 链接:- http://ideone.com/G1UBR5


pgr*_*ras 1

是的,这些方法不能在子类中重写。一个例子是模板方法模式......