为什么抽象类允许在其中定义具体方法

时间:2015-08-22 02:16:49

标签: java inheritance

我有一个抽象类A,它允许一些抽象方法和具体方法。我的问题是为什么抽象类允许声明具体方法,因为我们使用抽象类作为超类并使用扩展中的结构可以帮助我吗?

abstract class A{

public void aMethod(){
  System.out.println("Inside method");
 }
}

2 个答案:

答案 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();
        }       
    }

这允许您定义门的把手如何在子类中操作,但定义门的一般情况如何操作。