抽象类中的抽象方法

时间:2014-12-24 23:04:55

标签: java inheritance abstract-class

1 即可。为什么在Java中允许抽象类具有抽象方法?

2 即可。如果抽象类被广泛用于继承,为什么该类中没有未实现的方法?

第3 即可。为什么要在子类/子类中继承未实现的方法?我想我的问题是

在抽象类中使用抽象方法有什么好处?

我不明白。

提前感谢您的回答

3 个答案:

答案 0 :(得分:5)

让我举一个例子来自Head First Design Patterns

准备咖啡的方法和准备茶的方法非常相似。

  • 烧水
  • 酿造
  • 倒入杯子
  • 添加调味品

然后考虑以下课程

public abstract class CaffeineBeverage {
  public void final prepareReceipe() {
     boilWater();
     brew();
     pourInCup();
     addCondiments();
  }

  abstract void brew();
  abstract void addCondiments(); //milk, sugar, lemon?

   void boilWater(){
     //...
   }

  void pourInCup() {
   //...
  }
}

现在您可以定义两个子类,只需要实现部分配方,例如准备咖啡或准备茶。配方的过程已经封装在抽象类中,并且已经定义了遵循它的过程。子类只需要担心自己实现的步骤。

由于继承,子类将继承已在抽象类中实现的配方过程,因此您可以这样做:

CaffeineBeverage coffee = new CoffeeBeverage();
coffee.preperareReceipe();

配方将逐步进行,但有些步骤将在子类中实现,而有些则在父抽象类中实现。 Dynamic dispatch是一个关键概念。

显然,这只是抽象类概念的许多有用应用之一。

答案 1 :(得分:1)

摘要是一个不会实例化的类。如果在抽象类中声明一个抽象方法,那么您确定子类将实现此方法(它们是有义务的)。它就像一个界面。

答案 2 :(得分:0)

让我们看看我的例子是否会帮助你理解它。

在动物世界中,每只动物都可以吃。

同意?

但我相信你并不同意所有人都以同样的方式处理饮食。

例如,鱼吃的食物不同于老虎

public abstract class Animal {

   abstract void eat();
}

public class Fish extends Animal{

    @Override
    void eat() {
        System.out.println("fish eats");
    }
}

public class Tiger extends Animal{

    @Override
    void eat() {
        System.out.println("tiger eats");
    }

}

此过程称为 Polymoephism

  

将多个含义与一个函数名称相关联的能力   在这里吃。

抽象方法的一些注意事项:

  

<强> 1 即可。抽象方法没有实现。它只是一个方法签名。

     

<强> 2 即可。如果一个类有一个抽象方法,则必须将整个类声明为abstract。并非所有方法都必须是抽象的,即使是   类是抽象的。抽象类可以混合使用抽象   和非抽象方法。

     

第3 即可。抽象类的子类必须实现(覆盖)其抽象超类的所有抽象方法。非抽象方法   超类的内容只是按原样继承。他们也可以   如果需要,可以覆盖。