Java中的抽象类可以有final方法吗?
12 回答
当然。以模板方法模式为例。
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。
抽象类也可以有既不是抽象也不是最终的方法,只是常规方法。这些方法必须在抽象类中实现,但由实现者决定扩展类是否需要覆盖它们。
是的,它可以。但是 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
是的。
提示:只需启动您最喜欢的 IDE(eclipse、netbeans 等)并尝试一下。如果它不起作用,它会抱怨。
是的。
是的,这些方法不能在子类中被覆盖。一个例子是模板方法模式......
是的,它可以...需要更多字符
当然,这意味着您可以对其进行子类化,但您不能覆盖该特定方法。
是的。abstract
修饰符可以省略类的某些实现(即有一些方法abstract
),但不会对您施加任何限制。
在抽象类中,方法可以定义也可以不定义。如果我们扩展抽象类,那么只有它才有意义,所以我们在 Abstract 中声明或定义的任何方法都将在子类中覆盖。所以我们可以在抽象类中声明一个方法为final,它会在子类中被覆盖。
假设我想设计一个有一些实现的类,但我不希望其他(子类)实现它而是其他方法,那么在这种情况下,我们需要一个最终实现的方法和明显的选择抽象类。
是的,我们可以编写带有实现的最终方法。
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 方法执行为真