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

时间:2009-08-19 11:43:08

标签: java abstract-class final

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

12 个答案:

答案 0 :(得分:38)

不确定。请查看Template method pattern的示例。

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。

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

是。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

在抽象类方法中可以定义与否。如果我们扩展抽象类,那么只有它有意义,所以我们在Abstract中声明或定义的方法,它将覆盖在子类中。因此,我们可以在Abstract类中将方法声明为final,并且它将在子类中被覆盖。

答案 10 :(得分:0)

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

答案 11 :(得分: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方法 是