如果我们有覆盖的概念,为什么我们应该去抽象类。无论如何我们必须扩展抽象类来给出抽象方法的定义,我们可以简单地扩展和覆盖它的抽象方法,然后将它抽象化的逻辑是什么?
答案 0 :(得分:2)
假设您将建造许多不同类型的汽车:家用汽车,跑车,F1汽车......
对于所有这些,accele()方法将具有非常不同的实现。 假设您不会将Car设为抽象类,并提供加速实现。
如果有人要制造F1赛车,他可能会想:我们已经拥有加速功能,没有理由不使用它。最后,我们最终可能会以完全相同的方式加速所有类型的汽车。
这将导致非常缓慢的F1比赛,或基本的交通,即使Flash也不想成为行人。
抽象类是告诉'做什么',而不是'应该怎么做',但也有可能添加一些非抽象的方法,不像接口。
答案 1 :(得分:2)
抽象方法不能有实现,因此不会在抽象类中提供实现只是为了在(具体)子类中覆盖它。
抽象方法的目的是定义所有子类将拥有的公共行为。但是,此行为在抽象类的级别上是未知的。举一个简单的例子:
abstract public class Animal {
public abstract void eat();
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("I eat dog biscuits");
}
}
在这里,所有Animal
都吃了,但我们一开始就不知道它们吃了什么,直到我们创建了一个特定的子类。抽象方法非常适合这个问题。
答案 2 :(得分:1)
类动物:
public abstract class Animal{
protected abstract void makeNoise();
}
犬:
class Dog extends Animal{
protected void makeNoise(){
print("woof");
}
}
猫:
class Cat extends Animal{
protected void makeNoise(){
print("meow");
}
}
当我想要一些噪音时:
private Animal animal; // could be a (cute) dog or a cat or something else.
public void makeNoise(){
this.animal.makeNoise();
}
总之,正如您所说,抽象类给出了定义。定义可能很重要,尤其是当我想在不知道细节的情况下实现特定逻辑时。
答案 3 :(得分:0)
每当你不想允许你的班级实例时,你需要把它作为抽象类。
此外,抽象类可以包含一些方法,这些方法是所有子类的通用逻辑。
希望它有所帮助。
干杯。
答案 4 :(得分:0)
抽象类无法实例化。通过创建一个类摘要,您可以清楚地告知其用户它只是为扩展而设计的。
答案 5 :(得分:0)
假设您有一个抽象类Shape2D。你知道,你可以画出类似的东西,但确切地说,如何?您无法为Shape2D定义方法draw()。这个方法只是一个概念,可以绘制Shape2D的对象。
答案 6 :(得分:0)
使它成为抽象的原因是你不会从这个特定的类创建实例,因为它没有扩展行为(由其子类实现)是不完整的。
它为其子类提供了一种通用行为,因此您不必为每个子类编写此常见行为
答案 7 :(得分:0)
您创建抽象类以确保没有人将实例化。抽象类可能有主要逻辑,但仍需要一些应由抽象方法提供的信息。