1 即可。为什么在Java中允许抽象类具有抽象方法?
2 即可。如果抽象类被广泛用于继承,为什么该类中没有未实现的方法?
第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 即可。抽象类的子类必须实现(覆盖)其抽象超类的所有抽象方法。非抽象方法 超类的内容只是按原样继承。他们也可以 如果需要,可以覆盖。