最近我读到一个抽象方法本质上创建了一个标记为继承的方法,它是无块的,等待子类特化。我问这个: 创建抽象方法,允许其继承,创建子类版本,没有相应的超类方法,以及仅由/在子类中定义的方法有什么区别。 根据覆盖原则,子类对象不应自动使用子类方法,如果没有相应的超类方法,子类对象将始终使用子类方法。 创建抽象方法的目的是什么,而不仅仅是没有超类对应的标准方法。
我的知识可能完全有缺陷并扭曲了我的看法:-) 任何和所有的帮助将不胜感激
答案 0 :(得分:3)
它与Polymorphism有关;一个班级表现得像另一个班级的能力。
以一个名为Animal
的抽象类为例,该类被子类化为Dog
和Fish
。如果在Animal
类中我们有一个抽象方法move()
,那么Dog
和Fish
都将被强制实施move()
方法。
public class Animal {
public abstract void move();
}
public class Dog extends Animal {
public void move() {
System.out.println("walk");
}
}
public class Fish extends Animal {
public void move() {
System.out.println("swim");
}
}
此外,如果我们在某处有一个帮助方法:
public static void moveTheAnimal(Animal a) {
a.move();
}
然后我们知道无论提供什么具体的类(子类),都要定义move()
方法保证。
如果另一方面move()
课程中没有抽象方法Animal
,我们需要moveTheDog(Dog d)
和moveTheFish(Fish f)
等每种可能的动物。
答案 1 :(得分:0)
超类可以通过抽象方法将其部分职责委托给子类。这样做的好处是超类只包含通用的可重用逻辑,更具体的实现细节将被推送到继承树,再推到子类。
在这种情况下,超类仍然可能需要访问某些方法,就好像它们已经实现一样。这就是为什么你需要在超类中定义抽象无体方法 - 否则它将无法引用它们!
例如,超类可以处理数据处理,而具体的子类可以处理来自各种源的数据输入。在这种情况下,超类和子类可能如下所示:
class DataProcessor {
public void doWork() {
Data data = readData();
processData(data);
}
public abstract Data readData(); // this method is here and marked as abstract to make sure that:
// 1. child classes never fail to implement it;
// 2. parent class have a possibility to refer to the method that he is not actually implementing;
// 3. users of parent class have a possibility to refer to the method that parent is not capable of implementing.
}
class FileSystemDataProcessor extends DataProcessor {
public Data readData();
// handle data reading from the file system
}
}
答案 2 :(得分:0)
抽象方法的目的是告诉开发人员您希望每个子类都具有该方法的实现。以下是一个例子:
public class Animal {
public abstract void move(); // you expect that every animal will be able to move
}
public class Bird extends Animal {
@Override
public void move() { ... }
public void fly() { ... } // Birds can fly
}
public class Dog extends Animal {
@Override
public void move() { ... }
}
public class Pig extends Animal {
public void oink();
} // COMPILE ERROR
然后,当你有一个带有Animal
对象的函数时,你也暗示该函数不会执行Bird
,Dog
或{{Pig
的任何操作。 1}}具体。
如果在Animal
超类中没有提供抽象方法声明,则此函数将无法编译,因为它无法保证其任何子类具有move()
方法。