8

Java中的抽象类可以有final方法吗?

4

12 回答 12

41

当然。以模板方法模式为例。

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();
    }
}

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

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

于 2009-08-19T11:48:39.027 回答
7

是的,它可以。但是 final 方法本身不能是抽象的(同一个类中的其他非 final 方法可以)。

于 2009-08-19T11:50:22.970 回答
6

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

public abstract final void show();
    illegal combination of modifiers: abstract and final

这是实现的工作示例。

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();
    }
}

输出:-

Yes
Overridden
Success overriding

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

于 2015-09-03T12:35:16.377 回答
2

是的。

提示:只需启动您最喜欢的 IDE(eclipse、netbeans 等)并尝试一下。如果它不起作用,它会抱怨。

于 2009-08-19T11:47:06.567 回答
2

是的。

于 2009-08-19T12:01:08.550 回答
1

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

于 2009-08-19T11:45:59.080 回答
1

是的,它可以...需要更多字符

于 2009-08-19T11:46:01.827 回答
1

当然,这意味着您可以对其进行子类化,但您不能覆盖该特定方法。

于 2009-08-19T11:46:11.950 回答
0

是的。abstract修饰符可以省略类的某些实现(即有一些方法abstract),但不会对您施加任何限制。

于 2009-08-19T11:46:36.800 回答
0

在抽象类中,方法可以定义也可以不定义。如果我们扩展抽象类,那么只有它才有意义,所以我们在 Abstract 中声明或定义的任何方法都将在子类中覆盖。所以我们可以在抽象类中声明一个方法为final,它会在子类中被覆盖。

于 2012-10-04T11:32:04.907 回答
0

假设我想设计一个有一些实现的类,但我不希望其他(子类)实现它而是其他方法,那么在这种情况下,我们需要一个最终实现的方法和明显的选择抽象类。

于 2016-06-26T14:15:44.700 回答
0

是的,我们可以编写带有实现的最终方法。

public abstract class AbstractWithfinalMethod {
  public static  final boolean m1() {
    System.out.println(" M1 method executed");
    return true;
  }

  public static void main(String[] args) {
    System.out.println(m1());
  }
}

输出:M1 方法执行为真

于 2019-09-11T06:12:31.427 回答