我有一个抽象类A,它允许一些抽象方法和具体方法。我的问题是为什么抽象类允许声明具体方法,因为我们使用抽象类作为超类并使用扩展中的结构可以帮助我吗?
abstract class A{
public void aMethod(){
System.out.println("Inside method");
}
}
答案 0 :(得分:3)
除了共享接口之外,还有一个抽象类可以让您共享实现。只有抽象方法的抽象类就像一个接口,除了它可以让你共享数据成员。这不像让你分享某些实现那么强大。
例如,考虑Template Method模式,它依赖于抽象类共享实现的能力。模板方法以所有子类共有的方式执行操作,让子类提供细节。
这是一个非常简单的类层次结构,说明了这一点:
abstract class AbstractCreature {
protected abstract String myName();
public void sayHi() {
System.out.println("Hello, " + myName());
}
public void sayBye() {
System.out.println("Good bye, " + myName());
}
}
class Dolphin extends AbstractCreature {
@Override
protected String myName() {
return "dolphin";
}
}
class Bunny extends AbstractCreature {
@Override
protected String myName() {
return "bunny";
}
}
class Unicorn extends AbstractCreature {
@Override
protected String myName() {
return "unicorn";
}
}
此设置允许海豚,兔子和独角兽分享从抽象类继承的功能(即说出你好和再见的能力)。反过来,该功能依赖于子类中提供的抽象方法的覆盖。
如果抽象类允许具体方法,那么与普通类有什么区别?
这是一个公平的问题。区别在于标记类抽象告诉使用它的程序员必须继承该类才能有用;另一方面,常规课程开箱即用,没有继承权。
答案 1 :(得分:1)
抽象类不是纯粹的接口 您可以将Abstract类视为具体类和接口之间的混合。它们允许您为抽象类的所有子类提供通用行为。
例如,门将始终以相同的方式打开,您操作手柄并推动。所以你可以为门定义一个抽象类:
Abstract class Door {
public abstract void operateHandle();
public abstract void push();
public open() {
operateHandle();
push();
}
}
这允许您定义门的把手如何在子类中操作,但定义门的一般情况如何操作。