抽象类详解

java抽象类详解

  • java抽象类详解 abstract
  • 抽象类以及抽象方法格式定义
  • 抽象类以及抽象方法用例
  • 抽象类以及抽象方法使用场景
  • 抽象类使用注意事项

java抽象类详解 abstract

众所周知类中是有方法的,大家先看一看抽象方法跟抽象类的定义

  1. 抽象方法:只有方法的定义,没有方法体的实现,这种方法就是抽象方法
  2. 抽象类: 一个类中如果有抽象方法,那么这个类就是抽象类

抽象类以及抽象方法格式定义

抽象类:public abstract class A{}
抽象方法: abstract void method(); // 注意:抽象方法是没有方法体的,也就是没有大括号{}
我写一个简单地抽象类用法,看代码示例

抽象类以及抽象方法用例

// 先定义抽象类,里面有一个抽象方法
public abstract class Area{
    // 定义抽象方法
    abstract void area();
}
// A类继承抽象类
public class A extends Area{
    @Override
    void area() {
        System.out.println("我是A");
    }
}
// B类继承抽象类
public class B extends Area{
    @Override
    void area() {
        System.out.println("我是B");
    }
}
// 写一个main方法跑一下程序
public class Main {
    public static void main(String[] args) {
         A a = new A();
           a.area();
        B b = new B();
          b .area();
    }
}

打印结果如下,这是一个简单的应用。 那么我们在什么情况下才会使用抽象方法呢,下面我稍微写一下。

抽象类详解_第1张图片

抽象类以及抽象方法使用场景

一般情况下,我们不会用到抽象类,因为我们现在都是用接口+实现类来完成需求。那么抽象类能完成接口的任务吗。答案是完全可以,那么什么时候用接口,什么时候用抽象类呢。比如一个Dog类对象,他有睡觉的行为,看代码
抽象类详解_第2张图片

还有一个Cat对象也是有睡觉的行为。
抽象类详解_第3张图片

这里Dog对象跟Cat对象,有相同的行为。但是如果领导突然让你添加一个业务,说Dog对象跟Cat对象都有一个吃的行为。但是Dog吃的行为逻辑是 “吃骨头” Cat是吃鱼 这种既有共用(睡觉行为)又有多态(一个吃骨头,一个吃鱼)的对象。
这时我们就应该考虑优先使用抽象类了,但是有人说可以用接口去实现他们各自的行为吗,当然可以,但是接口方式很产生很多重复代码,这样的话你会每个实现类都去写一遍睡觉这个行为的逻辑,因为接口的设计只能满足于多态。像我们这种既有多态(Dog有吃骨头,Cat是吃鱼),又有复用(都有睡觉行为),那么最佳设计就是优先考虑我们的抽象类了。集成了以后直接调用一次就可以了。

抽象类有睡觉跟吃行为

抽象类详解_第4张图片

Dog对象继承了抽象类 Animal 并且重写了 eat()行为。因为Dog是吃骨头的,共同方法睡觉可以不用重写,只在抽象类中定义一次
抽象类详解_第5张图片
Cay对象继承了抽象类 Animal 并且重写了 eat()行为。因为Cat是吃鱼的,共同方法睡觉可以不用重写,只在抽象类中定义一次

抽象类详解_第6张图片

调用main方法输出吃跟睡觉结果。
抽象类详解_第7张图片

这样每个对象都没有重写共用方法sleep(),而是直接调用了,如果用接口来实现的话,需要实现类来重写一下sleep(),这样会产生很多重复代码。

抽象类使用注意事项

  1. 一个类如果定义为抽象类,那么里面可以没有抽象方法
  2. 一个类中如果有抽象方法,那么这个类必定是一个抽象类
  3. 抽象类不能被实例化,可以实例化非抽象子类的对象
    4 .抽象类的所有非抽象子类必须重写抽象类中的抽象方法
  4. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。

你可能感兴趣的:(java基础学习,抽象类)