Java 抽象类中的抽象方法

Java 抽象类中的抽象方法,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,1。为什么Java允许抽象类具有抽象方法 2。如果抽象类被广泛用于继承,为什么该类中会有未实现的方法 3。为什么要在子类/子类中继承未实现的方法??我想我的问题是 在抽象类中使用抽象方法有什么好处? 我不明白 提前感谢您的回答摘要是一个不会被实例化的类。如果您在抽象类中声明了一个抽象方法,那么您可以确定子类将实现这个方法(它们是必须的)。它就像一个界面。让我给你举一个例子 准备咖啡的方法和准备茶的方法非常相似 开水 酿制 倒进一杯 添加调味品 然后考虑下面的类 public abstract

1。为什么Java允许抽象类具有抽象方法

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

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

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

我不明白


提前感谢您的回答

摘要是一个不会被实例化的类。如果您在抽象类中声明了一个抽象方法,那么您可以确定子类将实现这个方法(它们是必须的)。它就像一个界面。

让我给你举一个例子

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

  • 开水
  • 酿制
  • 倒进一杯
  • 添加调味品
然后考虑下面的类

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();
配方将一步一步地进行,但有些步骤将在子类中实现,而有些步骤将在父抽象类中实现。这是一个关键概念


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

让我们看看我的示例是否能帮助您理解它

在动物世界里,每种动物都可以吃东西

同意吗

但我相信你也同意,并不是所有的人都以同样的方式进行饮食加工

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

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");
    }
}

这一过程被称为多源性

将多个含义关联到一个函数名的能力 那就是在这里吃

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

1。抽象方法没有实现。它只有一个方法签名

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

3。抽象类的子类必须实现(重写)其抽象超类的所有抽象方法。非抽象方法 超类的所有元素都是按原样继承的。它们也可以是 如果需要,将覆盖


如果你学习类似的东西,你会看到一个或多个有用的应用。抽象方法是一个必须在具体子类中实现的规范。我不知道为什么这个问题被搁置,因为它不清楚。这些问题清楚地说明了“在抽象类中使用抽象方法有什么好处?”真的吗?好的,你是说抽象类中的抽象方法可以由其他类实现,比如接口。我认为在实现接口时,类需要“implements”关键字。实际上,接口是一个带有抽象方法的抽象类。这是抽象类和子类之间的契约,它们“必须”实现这些抽象方法。我能理解@mkCode的意义,因为事实上,我也有同样的疑问。如果有的话,在
接口
中有一个方法签名,而不是在
抽象类
中有一个
抽象方法
,这两者之间有什么区别呢?差别不大。实现(我们称之为
A
)接口
或扩展
abstract
类的类应该实现
抽象方法
(如果
A
abstract
,那么它可以实现它或将它留给子类)虽然您的示例很好地解释了为什么需要抽象方法,但它不能证明需要抽象类。您可以在接口中更好地定义
Animal
抽象类,因为它不提供任何类型的状态或行为。为了证明一个抽象类的合理性,您需要一些方法的中间实现或持有一些可重用状态。所以,再一次,我的问题是为什么不为
动物
接口?以使op的生活更简单。我相信你知道,在java 8之后,接口不再是接口,因为我们可以向接口添加默认方法,但你不能向接口添加状态,所以抽象类仍然有一席之地。好的一点我不知道。但总的来说,我的回答是有道理的?好吧,那么如果您定义了一个
beveragable
接口
,并为这两个
void brew()定义了一个签名,那该怎么办
添加调味品()
方法,您将它们从
CaffineBeverage
类中删除,并使您的
CoffeeBeverage
TeaBeverage
扩展CaffeeNeBeverageì实现成为可扩展的
?有什么区别吗?@Pere是的,因为
caffinebeverage
中唯一的公共方法是
prepareRecipe
。在抽象类
caffinebeverage
中,方法
brew
addconsuments
不是公共的。它们是受包保护的,在这个框架中,类通常是受保护的方法。因此,如果你把它们放在一个接口中,你就暴露了应该对API使用者隐藏的API细节。这里的想法是模板方法封装了算法的步骤。在你提出的设计中,你是福辛