首页 专题 文章 代码 归档
Java 面向对象-抽象类
2020.02.27 19:27 2020.02.27 19:27

1. 抽象类

接上节,我们创建了一个Animal父类,有两个子类(CatDog)去继承该父类,然后重写父类中的方法,来实现多态的效果。

如下代码:

public class Animal {

    public void shout() {
        System.out.println("动物叫...");
    }
}

但实际上,我们我们只使用了两个子类中重写的shout方法,并没有使用父类的shout方法,所以可否将父类中的具体实现去掉?

可以,但是去掉实现的方法必须用abstract修饰,该方法就称为抽象方法

public abstract void shout();

若某个类中有抽象方法,该类也必须使用abstract修饰,该类也就称为抽象类

所以,原来的Animal父类,就变成了:

package test04;

public abstract class Animal {

    public abstract void shout();
}

是不是简洁了很多?


但是,是抽象类,那意味着无法实例化此类,否则会编译报错。

无法实例化的抽象类有什么用?

因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。

当我们定义了抽象类Animal,以及具体的DogCat子类的时候,我们可以通过抽象类Animal类型去引用具体的子类的实例:

public static void main(String[] args) {

    Animal cat = new Cat();
    Animal dog = new Dog();

    doShout(cat);//传入的是Animal类型
    doShout(dog);//传入的是Animal类型
}

面向抽象编程的本质就是:

  • 上层代码只定义规范(例如:abstract class Animal);
  • 不需要子类就可以实现业务逻辑(正常编译);
  • 具体的业务逻辑由不同的子类实现,调用者并不关心。
本节阅读完毕! (分享
二维码图片 扫描关注我们哟