【发布时间】:2010-11-20 22:15:38
【问题描述】:
Java 中的抽象类可以有 final 方法吗?
【问题讨论】:
标签: java abstract-class final
Java 中的抽象类可以有 final 方法吗?
【问题讨论】:
标签: java abstract-class final
是的,这些方法不能在子类中被覆盖。一个例子就是模板方法模式......
【讨论】:
是的,它可以...需要更多字符
【讨论】:
当然,这意味着你可以继承它,但你不能覆盖那个特定的方法。
【讨论】:
是的。 abstract 修饰符可以省略类的某些实现(即有一些 abstract 方法),但不会对您施加任何限制。
【讨论】:
是的。
提示:只需启动您最喜欢的 IDE(eclipse、netbeans 等)并尝试一下。如果它不起作用,它会抱怨。
【讨论】:
当然。以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。
抽象类也可以有既不是抽象也不是最终的方法,只是常规方法。这些方法必须在抽象类中实现,但由实现者决定扩展类是否需要覆盖它们。
【讨论】:
是的,可以。但是final方法本身不能是abstract(同一个类中的其他非final方法可以)。
【讨论】:
是的。
【讨论】:
抽象类中的方法可以定义也可以不定义。如果我们扩展抽象类,那么只有它才有意义,所以我们在 Abstract 中声明或定义的任何方法都将在子类中覆盖。所以我们可以在抽象类中声明一个方法为final,在子类中它会被覆盖。
【讨论】:
是的,“抽象”类中可能有“最终”方法。 但是,类中的任何“抽象”方法都不能声明为最终方法。 它会给出“修饰符的非法组合:abstract and 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
【讨论】:
假设我想设计一个有一些实现的类,但我不希望其他(子类)实现它而是其他方法,那么在这种情况下,我们需要一个最终实现的方法和明显的选择抽象类。
【讨论】:
是的,我们可以编写带有实现的最终方法。
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 方法 真的
【讨论】: