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

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

当然。 看一下示例的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(); } } 

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

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

是。

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

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

是的,“抽象”类中可能存在“最终”方法。 但是,类中的任何“抽象”方法都不能被声明为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

是。

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

是的它可以……需要更多的角色

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

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

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

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