为什么扩展抽象类来改变函数定义,当我可以简单地使用方法重写时?

leb*_*ski 1 java oop inheritance abstract-class abstract

假设我有一个Animal类,我想为每种动物设置不同的类和功能.有两种方法可以做到这一点:

  1. 方法覆盖继承:

    public class Animal {
        public void sound() {}
    }
    
    public class Dog extends Animal {
        public void sound() {
            System.out.println("bark");
        }
    }
    
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.sound();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过扩展Animal抽象类:

    abstract public class Animal {
        abstract public void sound();
    }
    
    public class Dog extends Animal {
        public void sound() {
            System.out.println("bark");
        }
    }
    
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound();
    }
    
    Run Code Online (Sandbox Code Playgroud)

那么为什么我们一直使用抽象类,当第一种方法完成同样的事情时呢?我理解为什么我们使用接口 - 它建立了一个契约,任何实现它的类都必须具有某些方法和属性.但是,当通过简单的继承实现同样的事情时,抽象类的用途是什么?

SHG*_*SHG 5

关于抽象类的一个重要问题 - 它无法实例化.因此,根据您的问题的性质,有时您会想要使用它.

动物实际上是一个很好的例子:

由于没有例子在世界上的动物,但实例具体只动物.所以 - 你想要一个抽象类Animal,特定的动物类将扩展它,并实现它的抽象方法.

此外,您可以在抽象类中使用非抽象方法 - 当扩展它的每个类都有共享/共同行为时,您可以使用这些方法.